C# 使用Odbc从C调用Oracle包函数#
我在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
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对我来说已经足够了。。。