2015-04-28 132 views
0

我想打電話給在C#C#OraOLEDB存儲過程OUT參數

過程只有一個OUT參數,由OraOLEDB提供一個簡單的存儲過程。這不起作用。

DataTable dt爲空之後那部分調用reader.GetSchemaTable()

有趣的是,如果我將REF CURSOR TYPE作爲輸出參數與其他存儲過程一起使用,我可以使其工作。這個過程沒有問題。它可以在sqlplus中調用。我讀過,我不需要(實際上不必)手動綁定REF CURSOR TYPE

問題是如何通過C#中的OraOLEDB調用具有非遊標類型輸出參數的存儲過程。

請給我一些建議。當您返回一個指針

的Oracle 11g,64位Windows 7 Link1 Link2

   try 
       { 
        string connStr = "Provider=OraOLEDB.Oracle.1;User ID=scott;Password=tiger;Data Source=//localhost:1521/orcl;OLEDB.NET=1;PLSQLRSet=1;"; 
        conn = new OleDbConnection(connStr); 
        conn.Open(); 

        OleDbCommand cmd = new OleDbCommand(); 
        cmd.Connection = conn; 

        OleDbParameter param = cmd.CreateParameter(); 
        param.ParameterName = "O_ENAME"; 
        param.Direction = ParameterDirection.Output; 
        param.OleDbType = OleDbType.Char; 
        param.Size = 15; 

        cmd.Parameters.Clear(); 
        cmd.Parameters.Add(param); 

        cmd.CommandType = CommandType.Text; 
        cmd.CommandText = "{CALL SCOTT.EMPINFO(?)}"; 

        OleDbDataReader reader = cmd.ExecuteReader();    
        DataTable dt = reader.GetSchemaTable(); 
       } 

存儲過程EMPINFO

CREATE OR REPLACE PROCEDURE 
EMPINFO(O_ENAME OUT VARCHAR2) 
IS 
BEGIN 
SELECT ENAME 
INTO O_ENAME 
FROM EMP 
WHERE EMPNO=7369; 
END; 
/
+0

我不熟悉Oracle,但對於SQL服務器,我會使用'ExecuteNonQuery()',然後從'param.Value'中讀取值。也許這在這種情況下也適用。 – Dirk

+0

非常感謝Dirk!你是對的!! :D – Song

回答

0

cmd.ExecuteReader()時才使用。

對於您必須使用此標量返回值:

cmd.ExecuteNonQuery(); 
string emp = param["O_ENAME"].Value; 

也許這個作品也:

string emp = cmd.ExecuteScalar().ToString(); 

除非你手動添加值,您不能使用數據表中的標量值。

+0

非常感謝!有用!!有用!! :D – Song

+0

如果你很高興,請將問題標記爲已回答。 –