作者diamondking (迷惘)
看板Database
标题Re: [问题]Asp.net读Oracle的问题
时间Fri Jun 6 13:10:57 2008
※ 引述《diamondking (迷惘)》之铭言:
: ※ 引述《weinine32 (孤僻寂寞)》之铭言:
: : ********
: : 最近在写一个支程式
: : 当使用者输入 起迄点的座标後
: : 就会依照使用者输入的起迄点座标
: : 把起点50公尺内有什麽公车站牌,Insert到 START 这个临时资料表
: : 把迄点50公尺内有什麽公车站牌,Insert到 END 这个临时资料表
: : 然後再做Select 把临时资料表内的资料捞出来
: : Begin
: : Insert Into START select 站牌名称 FROM 站牌资料表;
: : Insert Into END select 站牌名称 FROM 站牌资料表;
: : End;
: : Select * From Start, END
: : 但是我发现 BEGIN 和 SELECT 无法同时执行,
: : 也就是说要先执行 Begin end; 再执行 Select 才行
: : 当我把它写入 ASP.NET 用DataReader 执行这二段要分开写,写在一起会出错
: : **********以下程式出错***********
: : string SQL1 = "Begin (略) END; Select * From START, END ";
: : OracleCommand cmd1 = new OracleCommand(SQL1, conn);
: : OracleDataReader objRead = cmd1.ExecuteReader();
: : **********以上程式出错**************
: : *********以下程式可以正常执行**********
: : string SQL1 = "Begin (略) END;"
: : OracleCommand cmd1 = new OracleCommand(SQL1, conn);
: : cmd1.ExecuteNonQuery();
: : string SQL2 = "Select * from START, END ";
: : cmd1.CommandText=orstrSQL2;
: : OracleDataReader objRead = cmd1.ExecuteReader();
: : 虽然可以正常执行 但已经被Oracle试做二次连线
: : 无法Select到 SQL1的执行结果
: : 但我的OracleConnection 和 OracleCommad 是同一个物件了阿
: : ***************************************
: 1、看了一下你的目的,好像并不需要建临时表啊?
: 起点跟终点50m内的站牌,不能直接即时select出来吗?
: 如果是怕这份资料一直要用到,其实就一直重覆select就行了,
: 资料库会自己做cache,不用担心效能问题。
: 2、begin後面的select语句,只能用来把select出来的资料,塞进参数中,
: 不能像你那样,select出整张表放进datareader。
: 所以势必要分两段写:
: string SQL1 = "Begin (略) END;"
: OracleCommand cmd1 = new OracleCommand(SQL1, conn);
: cmd1.ExecuteNonQuery();
: cmd1.Commit(); //一定要commit,否则资料并没有真正塞进table中
: cmd1.CommandText="Select * from START";
: OracleDataReader objRead = cmd1.ExecuteReader();
: .........
: 不过这样写,也已经很简单了,不知道你的问题点在哪儿?
抱歉,是我搞错,你没有用Transaction,所以不需要Commit。
(没开vs.net就凭空回文Orz..)
如果你用ExecuteNonQuery()是直接就Commit了。
不过还是建议用Transaction配合Try..Catch的写法,
这样有错误时,可以补捉并RollBack(),没错再Commit()
另外我猜你的问题可能出在临时表的建立,你试着改成
CREATE GLOBAL TEMPORARY TABLE START
{
S1 NUMBER,
S2 NUMBER
} On Commit Preserve Rows;
^^^^^^^^^^^^^^^^^^^^^^^^^^
多加这行试试。
另外,你的Select,务必要用同一个连线,不要再另外建Connection,
这样才看得到资料。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.166.140.120
1F:推 weinine32:成功了,原来只要加上这一行就行了,多谢你的指导,可否 06/07 19:17
2F:推 weinine32:再请教,这一行的意思,我查网路,看得不太了解,事後同 06/07 19:34
3F:推 weinine32:一个使用者,做二次查询,SELECT出来,之前的东西没有清 06/07 19:46
4F:推 weinine32: 做第二次查询 除掉要如何清除掉? 06/07 19:51
5F:推 weinine32:我查一下网路似乎是要离开 SESSION ? 是ORACLE或ASP.NET 06/07 20:35
6F:推 weinine32:呢?我在CONNECT.CLOSE後再下session.clear 06/07 21:21
7F:推 weinine32:和session.remove 也没办法清楚,另外P币5000已送出谢谢 06/07 21:30