在ADO.NET中使用Oracle存儲程序
2024-08-29 13:38:59
供稿:網(wǎng)友
隨著近來 .NET Managed PRovider For Oracle 的發(fā)布,.NET開發(fā)人員最終擁有一套通過使用ADO.NET來快速訪問Oracle數(shù)據(jù)庫的方法。在 前一章節(jié) 里,我討論了如何使用Oracle治理提供者來連接和執(zhí)行SQL數(shù)據(jù)庫。現(xiàn)在讓我們看看如何在Oracle存儲程序中使用一個新的治理提供者。
可能和你以前的方法不一樣
假如你習慣于SQL服務器程序的開發(fā),你會發(fā)覺Oracle數(shù)據(jù)庫世界里是另一番天地。當運行SQL服務器程序時,訪問SQL查詢結(jié)果的過程正如把一個數(shù)據(jù)賦予DataReader, DataSet等那樣的簡單。這一過程和存儲程序的運行大致一樣,因為當一個命令執(zhí)行時,SQL服務器程序就會返回結(jié)果。表A中的代碼運行了一個名為sp_persons的存儲程序并把結(jié)果存放到DataSet。
表A代碼如下:
Listing A
Dim connectionString As String Dim sqlString As String Dim dataAdapter As System.Data.SqlClient.SqlDataAdapter; connectionString = "server= test;uid=test;pwd=test;database=.test.dbo" sqlString = “sp_persons” dataAdapter = New System.Data.SqlClient.SqlDataAdapter(sql,connectionString) Dim ds As New DataSet() dataAdapter.Fill(ds, “Persons”)
Oracle沒有遵循SQL服務器的返回數(shù)據(jù)模式。一個Oracle查詢的結(jié)果以一個指針的形式返回,這一指針也是作為Oracle存儲程序的一個輸出參數(shù)。所以當從.NET訪問Oracle數(shù)據(jù)庫時,你必須指定一個參數(shù)來指向指針。
利用OracleParameter生成參數(shù)
你可以充分利用System.Data.OracleClient.OracleParameter類,這些類能夠處理輸出和輸入?yún)?shù),并生成和配置參數(shù)。OracleCommand類包含一個能夠初始化參數(shù)對象的參數(shù)屬性。
表B范例如下:
Listing B
Dim conn As New OracleConnection() Dim comm As New OracleCommand() Dim pOutput As OracleParameter Dim dr As OracleDataReader conn.ConnectionString = “data source=oracle.server;user id=test;passWord=test” comm.CommandText = “DATABASE.STORED_PROCEDURE_NAME” comm.CommandType = CommandType.StoredProcedure pOutput = comm.Parameters.Add(“pcur”, OracleClient.OracleType.Cursor) pOutput.Direction = ParameterDirection.Output comm.Connection = conn conn.Open() dr = comm.ExecuteReader()
表B范例中,我建立了一個Oracle連接和使用了一個存儲程序作為命令。對比表A和表B,我們可以注重到命令類型必須設置為StoredProcedure,缺省情況下是文本,這對SQL的執(zhí)行是非常有好處的。一旦命令和連接建立起來,必須添加一個輸出參數(shù)來接收從存儲程序中返回的指針。添加OracleParameter對象的過程需要類型(如指針)和名字上的匹配。可能的設置包括:Input, Output,InputOutput, or ReturnValue。在這個范例中,指針接受了存儲程序的輸出,所以我把它的Direction設置為Output,最后,我打開了OracleDataReader以獲得命令的結(jié)果。
存儲程序的數(shù)據(jù)傳遞
存儲程序通常會接受一個或多個輸出數(shù)據(jù),這些數(shù)據(jù)用于控制程序的結(jié)果。例如,你不必需要從數(shù)據(jù)庫返回每一個記錄,相反,你只需返回一個與輸出結(jié)果相匹配的記錄。
OracleParameter對象提供了這樣的功能,表C演示了使用一個OracleParameter對象生成一個輸入?yún)?shù)的方法。這里我建立一個參數(shù)的Direction屬性為Input,OracleType enum定義了所有的Oracle數(shù)據(jù)類型,比如char,byte, DateTime, Float, Number等等。
微小的問題也會導致嚴重錯誤的產(chǎn)生
很多開發(fā)人員都已經(jīng)習慣了數(shù)據(jù)庫系統(tǒng)的程序開發(fā),但是,從一個系統(tǒng)向另一個系統(tǒng)的轉(zhuǎn)換會引起很多的麻煩,你必須清楚地理解各個數(shù)據(jù)庫系統(tǒng),這樣才能更好地編寫源代碼。
SQL服務器程序與Oracle之間的主要區(qū)別在于從存儲程序的不同返回方式。使用Oracle指針與使用OracleParameter一樣很方便。