>我正在尝试使用 C# 中的 Dd2OleDb ver.6 驱动程序调用 DB2 中的存储过程。当调用cmd.ExecuteNonQuery
时,抛出一个 SQLCode 为 -379 的OleDbException
。完整的消息如下。
我对另一个工作正常的存储过程进行了类似的调用。
在使用 IBM DB2 客户端时,这两个存储过程都可以正常工作,但是我们正在尝试采用使用 OleDB 的标准。所有参数值的类型正确且在范围内。
操作系统: 视窗 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
Source=System.Data堆栈跟踪:
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForMultpleResults(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteNonQuery() at CustomerCare.DataAccess.CisDataAccess.UpdateLog(Decimal customerNbr, Decimal premiseNbr, Decimal cmsgType, String cmsgText) in C:\TFS\MSServer\Source\Main\DataAccess\CisDataAccess.cs:line 103 at DataAccessTest.CisDataAccessTest.UpdateLog_Test() in C:\TFS\MSServer\Source\Main\DataAccessTest\CisDataAccessTest.cs:line 30
System.IndexOutOfRangeException
HResult=0x80131508
Message=Invalid index -1 for this OleDbParameterCollection for Count=6。
源=系统.数据
显然,在根据值识别数据类型时,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);