Получение SQLCode -379 при выполнении хранимой процедуры через DB2OLEDB - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь вызвать хранимую процедуру в DB2, используя драйвер Dd2OleDb ver.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
Source = System.Data

StackTrace:

в System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling (OleDbHResult hr) в System.D.OleDbCommand.ExecuteCommandTextForMultpleResults (tagDBPARAMS dbParams, Object & executeResult) в System.Data.OleDb.OleDbCommand.ExecuteCommandText (Object & executeResult) в System.Data.OleDeODeObDeOQDOQD_ObDesigner_ObDell_Ru.OQD_OQD.ExecuteReaderInternal (поведение CommandBehavior, метод String) в System.Data.OleDb.OleDbCommand.ExecuteNonQuery () в CustomerCare.DataAccess.CisDataAccess.UpdateLog (десятичное значение customerNbr, десятичное premiseNbr, десятичное число cmsgType \ C: TXS: TXT: TXTSTERS \ TXTFS)Source \ Main \ DataAccess \ CisDataAccess.cs: строка 103 в DataAccessTest.CisDataAccessTest.UpdateLog_Test () в C: \ TFS \ MSServer \ Source \ Main \ DataAccessTest \ CisDataAccessTest.cs: строка 30

System.IndexOf_Exception1031 * HResult = 0x80131508
Сообщение = недопустимый индекс -1 для этой коллекции OleDbParameterCount с счетчиком = 6.
Источник = System.Data

1 Ответ

1 голос
/ 29 марта 2019

Очевидно, что конструктор 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);
...