Что такое правильная команда odbc для вызова хранимой процедуры Oracle с параметрами из .Net? - PullRequest
0 голосов
/ 22 апреля 2010

В случае 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 Ответ

3 голосов
/ 22 апреля 2010

Я использую .NET 3.5 и Oracle 10gR2. Я добавил выходной параметр в ответ на ваш комментарий.

Server, Uid и Pwd были изменены, чтобы защитить невинных. Установите для них соответствующие значения.

Моя хранимая процедура:

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
        }
    }
}

При использовании параметров OUT или IN OUT для свойства Size OdbcParameter должно быть установлено адекватное значение.

В ответ на ваш комментарий относительно обработки исключений, я бы попросил вызывающего метода доступа к данным обработать исключения. При использовании конструкции using метод Dispose будет автоматически вызываться для объектов команд и соединений независимо от того, есть ли исключение.

...