使用.Net参数调用Oracle存储过程的正确odbc命令是什么?

时间:2010-04-21 23:13:08

标签: .net oracle stored-procedures parameters odbc

对于MSFT SQL Server 08,它是:

odbcCommand = new OdbcCommand("{call " + SP_NAME + " (?,?,?,?,?,?,?) }", odbcConn);

当我尝试为Oracle做同样的事情时,我得到:

OdbcException: ERROR [HYC00] [Oracle][ODBC]Optional feature not implemented.

随意请求澄清,请帮忙。我使用的是.Net 3.5,SQL Server 08和Oracle 11g_home1。

P.S。 Oracle存储过程确实有3个以上的参数,但我相信我在我的代码中处理它。

1 个答案:

答案 0 :(得分:3)

我正在运行.NET 3.5和Oracle 10gR2。我添加了一个输出参数来回应你的评论。

ServerUidPwd已更改以保护无辜者。将它们设置为适当的值。

我的存储过程:

create or replace
procedure test_proc(p1 in number, p2 in out varchar2) is
begin
  p2 := to_char(p1 + to_number(p2));
end;

我的测试代码:

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

class OdbcTest
{
    const string connectionString =
        @"Driver={Microsoft ODBC for Oracle};" +
        @"Server=MyTnsName;" +
        @"Uid=MySchema;" +
        @"Pwd=MyPassword;";

    public static string TryMe()
    {
        using (var odbcConn = new OdbcConnection(connectionString))
        using (var odbcCommand = odbcConn.CreateCommand())
        {
            odbcCommand.CommandText = "{ CALL test_proc(?, ?) }";
            odbcCommand.CommandType = CommandType.StoredProcedure;

            odbcCommand.Parameters.Add("p1", OdbcType.Decimal).Value = 42;
            var p2 = odbcCommand.Parameters.Add("p2", OdbcType.VarChar, 30);
            p2.Direction = ParameterDirection.InputOutput;
            p2.Value = "25";

            odbcConn.Open();
            odbcCommand.ExecuteNonQuery();

            return p2.Value as string; // returns 67
        }
    }
}

使用OUTIN OUT参数时,Size的{​​{1}}属性必须设置为足够的值。

在回复你关于异常处理的评论时,我会让数据访问方法的调用者处理异常。使用OdbcParameter构造,无论是否存在异常,都将在命令和连接对象上自动调用using方法。