Получение кода SQLCode -379 при выполнении хранимой процедуры через DB2OLEDB

Я пытаюсь вызвать хранимую процедуру в DB2, используя драйвер Dd2OleDb ver.6 из C#. При вызове cmd.ExecuteNonQuery генерируется OleDbException с SQLCode -379. Полное сообщение ниже.

У меня есть аналогичный вызов другой хранимой процедуры, которая отлично работает.

Обе хранимые процедуры прекрасно работают при использовании клиентов IBM DB2, однако мы пытаемся принять стандарт использования OleDB. Все значения параметров имеют правильный тип и находятся в диапазоне.

ОС: Windows 8.1

.NET Framework 4.6.1 Visual Studio 2017

С# клиент

const string storedProc = @"T99XXX.CI419UPDATE";

using (var conn = GetCisDBConnection())
using (var cmCommand = new OleDbCommand(storedProc, conn))
{
       cmCommand.CommandType = System.Data.CommandType.StoredProcedure;

       var pCustNbr = new OleDbParameter("P_CUST_NBR", customerNbr);
       var pPremNbr = new OleDbParameter("P_PREM_NBR", premiseNbr);
       var pCmsgType = new OleDbParameter("P_CMSG_TYPE", cmsgType);
       var pCmsgText = new OleDbParameter("P_CMSG_TEXT", cmsgText);
       var pStatus = new OleDbParameter("O_STATUS", OleDbType.Integer, 10, System.Data.ParameterDirection.Output, true, 0, 0, null, System.Data.DataRowVersion.Current, null);
       var pSqlCode = new OleDbParameter("O_SQLCODE", OleDbType.Integer, 10, System.Data.ParameterDirection.Output, true, 0, 0, null, System.Data.DataRowVersion.Current, null);

       cmCommand.Parameters.Add(pCustNbr);
       cmCommand.Parameters.Add(pPremNbr);
       cmCommand.Parameters.Add(pCmsgType);
       cmCommand.Parameters.Add(pCmsgText);
       cmCommand.Parameters.Add(pStatus);
       cmCommand.Parameters.Add(pSqlCode);

       conn.Open();
       cmCommand.ExecuteNonQuery(); // Returns -379

Заголовок хранимой процедуры:

CREATE PROCEDURE T14TOPS.CI419UPDATE (
    IN P_CUST_NBR DECIMAL(7,0),
    IN P_PREM_NBR DECIMAL(7,0),
    IN P_CMSG_TYPE DECIMAL(3,0),
    IN P_CMSG_TEXT VARCHAR(980),
    OUT O_STATUS INTEGER,
    OUT O_SQLCODE INTEGER)

Полное сообщение об ошибке

System.Data.OleDb.OleDbException
HResult=0x80040E14
Message=Произошла ошибка внутренней сетевой библиотеки. Произошла синтаксическая ошибка на уровне сети. SQLSTATE: HY000, SQLCODE: -379
Source=System.Data

Трассировки стека:

в System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) в System.Data.OleDb.OleDbCommand.ExecuteCommandTextForMultpleResults(tagDBPARAMS dbParams, Object& executeResult) в System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) в System.Data. OleDb.OleDbCommand.ExecuteCommand (поведение CommandBehavior, Object& executeResult) в System.Data.OleDb.OleDbCommand.ExecuteReaderInternal (поведение CommandBehavior, метод String) в System.Data.OleDb.OleDbCommand.ExecuteNonQuery() в CustomerCare.DataAccess.CisDataAccess.UpdateLog( Decimal customerNbr, Decimal premiseNbr, Decimal cmsgType, String cmsgText) в C:\TFS\MSServer\Source\Main\DataAccess\CisDataAccess.cs:строка 103 в DataAccessTest.CisDataAccessTest.UpdateLog_Test() в C:\TFS\MSServer\Source\ Main\DataAccessTest\CisDataAccessTest.cs:строка 30

System.IndexOutOfRangeException
HResult=0x80131508
Message=Неверный индекс -1 для этой коллекции OleDbParameterCollection со значением Count=6.
Source=System.Data


person Jack Whipnert    schedule 29.03.2019    source источник
comment
Попробуйте установить тип параметра. Похоже, у вас есть смесь десятичной и строковой. Убедитесь, что параметры указаны в том же порядке, в котором они указаны в хранимой процедуре, поскольку OleDb игнорирует имя параметра и опирается на позицию в индексе. Что-то глупое с этими параметрами, так как вы получаете сообщение Invalid index -1 for this OleDbParameterCollection.   -  person LarsTech    schedule 29.03.2019


Ответы (1)


По-видимому, конструктор OleDBParameter не на 100 % определяет тип данных на основе значения. Использование конструктора, который принимает тип данных, и последующее присвоение значения решило проблему.

var pCustNbr = new OleDbParameter("P_CUSTNBR", OleDbType.Decimal) { Value = customerNbr }; 
var pPremNbr = new OleDbParameter("P_PREM_NBR", OleDbType.Decimal) { Value = premiseNbr };
var pCmsgType = new OleDbParameter("P_CMSG_TYPE", OleDbType.Decimal) { Value = cmsgType };
var pCmsgText = new OleDbParameter("P_CMSG_TEXT", OleDbType.VarChar) { Value = cmsgText };
var pStatus = new OleDbParameter("O_STATUS", OleDbType.Integer, 10, System.Data.ParameterDirection.Output, true, 0, 0, null, System.Data.DataRowVersion.Current, null);
var pSqlCode = new OleDbParameter("O_SQLCODE", OleDbType.Integer, 10, System.Data.ParameterDirection.Output, true, 0, 0, null, System.Data.DataRowVersion.Current, null);
person Jack Whipnert    schedule 29.03.2019