[英]Issues calling Oracle stored procedure from C#
這是我第一次必須從C#調用Oracle存儲過程,而且我不知道為什么我的代碼無法正常工作。 我要做的就是返回一個數據表。 我的存儲過程可以正常編譯-這是一些描述它的偽代碼:
CREATE OR REPLACE PROCEDURE SPROC_ONLINE
( Year IN NUMBER DEFAULT NULL
, Name IN VARCHAR2 DEFAULT NULL
, ID IN VARCHAR2 DEFAULT NULL
, refCursor OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN refCursor FOR
SELECT *
FROM TABLE
WHERE Field_Year = Year
AND Field_Name = Name
AND Field_ID = ID;
END SPROC_ONLINE;
這是一些描述我的C#的偽代碼:
public static DataTable search(int? Year, string Name, string ID)
{
try
{
OracleConnection conn = getConnectionString();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "SPROC_ONLINE";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("Year", OracleDbType.Int32).Value = Year;
cmd.Parameters.Add("Name", OracleDbType.Varchar2).Value = Name;
cmd.Parameters.Add("ID", OracleDbType.Varchar2).Value = ID;
cmd.Parameters.Add("Output", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
DataTable dt = new DataTable();
OracleDataAdapter da = new OracleDataAdapter(cmd);
getConnectionString().Open();
cmd.ExecuteNonQuery();
da.Fill(dt);
return dt;
}
catch (Exception e) { throw new Exception("Error: " + e.Message); }
finally { getConnectionString().Close(); }
}
沒有錯誤被拋出; 只是返回的數據表在不應該為null時(我正在測試的參數應該返回某值)為null。
我在這里做錯了什么?
我認為您可能需要使用OracleDataReader
。
using(OracleCommand cmd = new OracleCommand("SPROC_ONLINE", TheConnection))
{
using(OracleDataReader reader = new OracleDataReader())
{
while(reader.Read())
{
// Extract the values
var a = reader["Year"];
var b = reader["Name"];
var c = reader["ID"];
... etc ...
}
}
}
我的問題最終有兩個方面。 這是我最終得到的代碼背后:
public static DataTable search(int? Year, string Name, string ID)
{
try
{
using (var cmd = new OracleCommand("SPROC_ONLINE", getConnectionString()))
{
cmd.CommandType = CommandType.StoredProcedure;
var da = new OracleDataAdapter(cmd);
cmd.Parameters.Add("Year", OracleDbType.Int32).Value = Year;
cmd.Parameters.Add("Name", OracleDbType.Varchar2).Value = Name;
cmd.Parameters.Add("ID", OracleDbType.Varchar2).Value = ID;
cmd.Parameters.Add("Output", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
catch (Exception e) {throw new Exception("Error: " + e); }
finally {}
}
我的另一個問題是我沒有意識到Oracle中的字符串比較區分大小寫。 顯然,在SQL Developer中編譯存儲過程與嘗試在Visual Studio中對其進行測試之間,我並沒有始終如一地輸入“ Name”參數。 這解釋了為什么將返回空數據表。 我對存儲過程的WHERE子句進行了如下調整:
WHERE Field_Year = Year
AND UPPER(Field_Name) = UPPER(Name)
AND Field_ID = ID;
現在一切正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.