2010-06-01 177 views
1

Oracle包功能我有一個Oracle包內定義的函數:呼叫使用ODBC從C#

CREATE OR REPLACE PACKAGE BODY TESTUSER.TESTPKG as 
    FUNCTION testfunc(n IN NUMBER) RETURN NUMBER as 
    begin 
    return n + 1; 
    end testfunc; 
end testpkg; 
/

我怎樣才能把它從使用ODBC C#?我試過以下內容:

using System; 
using System.Data; 
using System.Data.Odbc; 

class Program { 
    static void Main(string[] args) { 
     using (OdbcConnection connection = new OdbcConnection("DSN=testdb;UID=testuser;PWD=testpwd")) { 
      connection.Open(); 

      OdbcCommand command = new OdbcCommand("TESTUSER.TESTPKG.testfunc", connection); 
      command.CommandType = System.Data.CommandType.StoredProcedure; 

      command.Parameters.Add("ret", OdbcType.Int).Direction = ParameterDirection.ReturnValue; 

      command.Parameters.Add("n", OdbcType.Int).Direction = ParameterDirection.Input; 
      command.Parameters["n"].Value = 42; 

      command.ExecuteNonQuery(); 
      Console.WriteLine(command.Parameters["ret"].Value); 
     } 
    } 
} 

但是我收到一個異常說「無效的SQL語句」。
我在做什麼錯?

回答

3

在過去,我會使用類似下列的命令字符串:

「{?= CALL JF_TESTUSER.TESTPKG.testFunc(?)}」

請參閱以下article瞭解更多信息

+0

這也適用,謝謝。 – 2010-06-01 12:39:04

2

嘗試

OdbcCommand command = new OdbcCommand("begin ? := TESTUSER.TESTPKG.testfunc(?) end;", connection); 
1

我設法打電話給這樣的包裝功能:

command.CommandText = @"begin 
    :ret := ILMTEST.testpkg.testfunc(:n); 
end;"; 
command.CommandType = System.Data.CommandType.Text; 
0

我認爲你應該考慮使用Oracle Client來代替。

如果您選擇ODBC只是爲了創建一個DSN,然後連接到它以某種方式與數據庫不可知,請考慮使用Enterprise LibraryData Access Application Block

+0

我想避免使用Oracle客戶端來避免部署額外的程序集;使用Oracle Client的原因是什麼? – 2010-06-01 13:41:14

+0

首先,它可以輕鬆處理Oracle Package功能。其次,它針對Oracle進行了優化,因此在訪問數據時可以獲得更好的性能。第三,因爲即使微軟也不贊成其作爲GAC一部分的System.Data.OracleClient提供商,因此,如果我們可以這麼說,那麼認識到「ODP」是最好的。 – 2010-06-01 13:45:57

+0

我在這裏沒有使用System.Data.OracleClient提供程序,並且我設法做到了我需要的東西。我應該檢查性能,但暫時看起來Odbc對我來說已經足夠了... – 2010-06-01 15:04:29