通过DB2OLEDB

时间:2019-03-29 16:43:08

标签: c# stored-procedures oledbcommand sqlcode

我正在尝试使用来自C#的Dd2OleDb ver.6驱动程序在DB2中调用存储过程。调用cmd.ExecuteNonQuery时,将引发SQLCode为-379的OleDbException。完整的消息在下面。

我对另一个工作正常的存储过程进行了类似的调用。

使用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
  Message =发生内部网络库错误。发生了网络级语法错误。 SQLSTATE:HY000,SQLCODE:-379
  源= System.Data

     

StackTrace:

     

在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行为,对象和executeResult)      在System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior行为,String方法)      在System.Data.OleDb.OleDbCommand.ExecuteNonQuery()      在C:\ TFS \ MSServer \ Source \ Main \ DataAccess \ CisDataAccess.cs:line 103中的CustomerCare.DataAccess.CisDataAccess.UpdateLog(Decimal customerNbr,Decimal前提Nbr,Decimal cmsgType,String cmsgText)中      在C:\ TFS \ MSServer \ Source \ Main \ DataAccessTest \ CisDataAccessTest.cs:第30行的DataAccessTest.CisDataAccessTest.UpdateLog_Test()中

     

System.IndexOutOfRangeException
  HResult = 0x80131508
  Message =此OleDbParameterCollection的索引无效-1,计数为6。
  Source = System.Data

1 个答案:

答案 0 :(得分: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);