作者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
推 weinine32:成功了,原來只要加上這一行就行了,多謝你的指導,可否 06/07 19:17
推 weinine32:再請教,這一行的意思,我查網路,看得不太了解,事後同 06/07 19:34
推 weinine32:一個使用者,做二次查詢,SELECT出來,之前的東西沒有清 06/07 19:46
推 weinine32: 做第二次查詢 除掉要如何清除掉? 06/07 19:51
推 weinine32:我查一下網路似乎是要離開 SESSION ? 是ORACLE或ASP.NET 06/07 20:35
推 weinine32:呢?我在CONNECT.CLOSE後再下session.clear 06/07 21:21
推 weinine32:和session.remove 也沒辦法清楚,另外P幣5000已送出謝謝 06/07 21:30