C# 使用Odbc从C调用Oracle包函数#

C# 使用Odbc从C调用Oracle包函数#,c#,oracle,odbc,C#,Oracle,Odbc,我在Oracle软件包中定义了一个函数: 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

我在Oracle软件包中定义了一个函数:

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语句”。

我做错了什么?

过去,我会对命令字符串使用如下内容:

“{?=调用JF_TESTUSER.TESTPKG.testFunc(?)”


有关详细信息,请参见以下内容

在过去,我会使用类似以下内容的命令字符串:

“{?=调用JF_TESTUSER.TESTPKG.testFunc(?)”

有关更多信息,请参见以下内容

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


我成功地调用了包函数,如下所示:

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

我成功地调用了包函数,如下所示:

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

我认为你应该考虑用这个词。


如果你选择ODBC创建一个<代码> DSN<代码>,然后连接到它,在某种程度上是数据库不可知的,考虑使用.< /P> < P>我想你应该考虑用它代替.< /P>


如果您选择ODBC只创建一个代码> DSN<代码>,然后连接到它,在某种程度上是数据库不可知的,请考虑使用.< /p>我希望避免使用Oracle客户端来避免部署额外的程序集;使用Oracle客户端的原因是什么?首先,它可以轻松处理Oracle软件包功能。第二,它针对Oracle进行了优化,因此在访问数据时可以获得更好的性能。第三,因为即使是微软也不赞成它的System.Data.OracleClient提供程序,它是GAC的一部分,因此,如果我们可以这样说的话,它以某种方式认识到,

ODP
是最好的。我在这里没有使用System.Data.OracleClient提供程序,我设法做到了我需要的。我应该检查一下性能,但目前看来Odbc对我来说已经足够了……我想避免使用Oracle客户端来避免部署额外的程序集;使用Oracle客户端的原因是什么?首先,它可以轻松处理Oracle软件包功能。第二,它针对Oracle进行了优化,因此在访问数据时可以获得更好的性能。第三,因为即使是微软也不赞成它的System.Data.OracleClient提供程序,它是GAC的一部分,因此,如果我们可以这样说的话,它以某种方式认识到,
ODP
是最好的。我在这里没有使用System.Data.OracleClient提供程序,我设法做到了我需要的。我应该检查一下性能,但目前看来Odbc对我来说已经足够了。。。