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

#c# #stored-procedures #oledbcommand #sqlcode

#c# #хранимые процедуры #oledbcommand #sqlcode

Вопрос:

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

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

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

ОПЕРАЦИОННАЯ система: Windows 8.1

.Net Framework 4.6.1 Visual Studio 2017

Клиент C #

 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
Сообщение = Произошла ошибка внутренней сетевой библиотеки. Произошла синтаксическая ошибка сетевого уровня. SQLSTATE: HY000, SQLCODE: -379
Источник = System.Данные

Отслеживание стека:

в System.Data.OleDb.OleDbCommand.Выполнить командную обработку текста (OleDbHResult hr) в System.Data.OleDb.OleDbCommand.Выполнитькомандуtextformultpleresults(tagDBPARAMS dbParams, Objectamp; ExecuteResult) в System.Data.OleDb.OleDbCommand.Выполнить командный текст (Objectamp; ExecuteResult) в System.Data.OleDb.OleDbCommand.Выполнить команду (CommandBehavior behavior, Objectamp; ExecuteResult) в System.Data.OleDb.OleDbCommand.ExecuteReaderInternal (командное поведение, строковый метод) в System.Data.OleDb.OleDbCommand.ExecuteNonQuery() в CustomerCare.Доступ к данным.CisDataAccess.Список обновлений (десятичный customerNbr, Десятичный premiseNbr, десятичный cmsgType, строка cmsgText) в C:TFSMSServerSourceMainDataAccessCisDataAccess.cs:line 103 в DataAccessTest.CisDataAccessTest.UpdateLog_Test() в C:TFSMSServerSourceMainDataAccessTestCisDataAccessTest.cs:line 30

Система.Исключение IndexOutOfRangeException
HResult=0x80131508
Сообщение= Недопустимый индекс -1 для этой коллекции OleDbParameterCollection с Count = 6.
Источник=System.Data

Комментарии:

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

Ответ №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);