已达到当前连接的最大语句数。 SQLSTATE:HY000,SQLCODE:-1500
The maximum number of statements has been reached for the current connection. SQLSTATE: HY000, SQLCODE:-1500
我正在开发桌面应用程序并使用 OLEDB 提供程序连接到 DB2 数据库。尝试使用不同的值执行更新语句 100 次时,出现异常
"The maximum number of statements has been reached for the current connection. SQLSTATE: HY000, SQLCODE:-1500."
我能够成功执行更新语句15次。
如何增加一个连接的语句限制?
我在连接字符串中添加了 'MARS Connection=True;'。但它没有用:(
OleDbConnection conn = new OleDbConnection("ConnectionString");
conn.Open();
DbTransaction trans = conn.BeginTransaction();
ConnectionInfo connInfo = new ConnectionInfo(trans);
DBCommandWrapper cmdUpdate = cmdFactory.CreateDBCommandWrapper(connInfo.Connection, "UpdateAccount", connInfo.Transaction);
cmdUpdate.SetParameterValue("@CustomerNumber", intToCustomerNumber);
cmdUpdate.SetParameterValue("@BankNumber", account.BankNumber);
cmdUpdate.SetParameterValue("@AccountNumber", Convert.ToDouble(account.AccountNumber.Trim()));
RowsAffected = cmdUpdate.CommandObject.ExecuteNonQuery();
更新查询是
<command name="UpdateAccount" commandType="Text">
<commandText>
UPDATE #.ACCOUNT1
SET CustNum = ?
WHERE BankNum = ?
AND AcctNum = ?
</commandText>
<parameters>
<parameter name="@CustomerNumber" dbType="Decimal" scale="0" precision="0" size="0" direction="Input" value="" isNullable="false" sourceColumn="" sourceVersion="Default" />
<parameter name="@BankNumber" dbType="Decimal" scale="0" precision="0" size="0" direction="Input" value="" isNullable="false" sourceColumn="" sourceVersion="Default" />
<parameter name="@AccountNumber" dbType="Double" scale="0" precision="0" size="0" direction="Input" value="" isNullable="false" sourceColumn="" sourceVersion="Default" />
</parameters>
</command>
如Troubleshooting the OLE DB Provider for DB2中所述,SQLCODE:-1500
表示DB2OLEDB_MAX_SECTIONS
,这解释了这条消息:
The maximum number of statements (128) has been reached for the
current connection.
默认情况下,DB2 的 OLE DB 提供程序使用 128 个包部分,允许客户端为每个启动的连接执行 128 个并发准备好的语句。如果未完成的并发语句超过默认预定义部分的数量,则无法执行新语句。
对于大多数问题,部分限制似乎是从 OLE DB 提供程序设置中硬编码的,但您可以尝试在注册表中找到名为 NumberOfPackages
的 REG_DWORD
键(参见 this reference) .如果密钥存在,请使用大于 128 的 2 的幂(例如 256、512 等)修改它,然后重新创建包,否则您需要在当前连接中使用较少数量的准备好的语句来解决此问题。
更新 1
SQLSTATE: 07002, SQLCODE: -804
表示此问题基于 DB2 documentation:
An error was found in the application program input parameters for the
SQL statement.
Reason: Prepare of EXECUTE IMMEDIATE.
换句话说,消息告诉调用参数列表或SQLDA无效,这与EXECUTE IMMEDIATE命令有关(通常用于动态SQL字符串)。
带有动态查询字符串的 DB2 更新过程应该类似于此示例:
CREATE OR REPLACE PROCEDURE UpdateDDATransferAccount(IN [parameter_name] [data_type](size) ...)
-- query settings
BEGIN
DECLARE statement = VARCHAR(2000) -- size of query string
SET statement = 'UPDATE [schema].' || '[table_name]' || ' SET [field_name] = ' || '[parameter_name]' || ' ... ' WHERE ' || '[field_name]' || ' = ' || '[parameter_name_or_value]';
EXECUTE IMMEDIATE statement;
END;
类似问题:
我正在开发桌面应用程序并使用 OLEDB 提供程序连接到 DB2 数据库。尝试使用不同的值执行更新语句 100 次时,出现异常 "The maximum number of statements has been reached for the current connection. SQLSTATE: HY000, SQLCODE:-1500."
我能够成功执行更新语句15次。 如何增加一个连接的语句限制? 我在连接字符串中添加了 'MARS Connection=True;'。但它没有用:(
OleDbConnection conn = new OleDbConnection("ConnectionString");
conn.Open();
DbTransaction trans = conn.BeginTransaction();
ConnectionInfo connInfo = new ConnectionInfo(trans);
DBCommandWrapper cmdUpdate = cmdFactory.CreateDBCommandWrapper(connInfo.Connection, "UpdateAccount", connInfo.Transaction);
cmdUpdate.SetParameterValue("@CustomerNumber", intToCustomerNumber);
cmdUpdate.SetParameterValue("@BankNumber", account.BankNumber);
cmdUpdate.SetParameterValue("@AccountNumber", Convert.ToDouble(account.AccountNumber.Trim()));
RowsAffected = cmdUpdate.CommandObject.ExecuteNonQuery();
更新查询是
<command name="UpdateAccount" commandType="Text">
<commandText>
UPDATE #.ACCOUNT1
SET CustNum = ?
WHERE BankNum = ?
AND AcctNum = ?
</commandText>
<parameters>
<parameter name="@CustomerNumber" dbType="Decimal" scale="0" precision="0" size="0" direction="Input" value="" isNullable="false" sourceColumn="" sourceVersion="Default" />
<parameter name="@BankNumber" dbType="Decimal" scale="0" precision="0" size="0" direction="Input" value="" isNullable="false" sourceColumn="" sourceVersion="Default" />
<parameter name="@AccountNumber" dbType="Double" scale="0" precision="0" size="0" direction="Input" value="" isNullable="false" sourceColumn="" sourceVersion="Default" />
</parameters>
</command>
如Troubleshooting the OLE DB Provider for DB2中所述,SQLCODE:-1500
表示DB2OLEDB_MAX_SECTIONS
,这解释了这条消息:
The maximum number of statements (128) has been reached for the current connection.
默认情况下,DB2 的 OLE DB 提供程序使用 128 个包部分,允许客户端为每个启动的连接执行 128 个并发准备好的语句。如果未完成的并发语句超过默认预定义部分的数量,则无法执行新语句。
对于大多数问题,部分限制似乎是从 OLE DB 提供程序设置中硬编码的,但您可以尝试在注册表中找到名为 NumberOfPackages
的 REG_DWORD
键(参见 this reference) .如果密钥存在,请使用大于 128 的 2 的幂(例如 256、512 等)修改它,然后重新创建包,否则您需要在当前连接中使用较少数量的准备好的语句来解决此问题。
更新 1
SQLSTATE: 07002, SQLCODE: -804
表示此问题基于 DB2 documentation:
An error was found in the application program input parameters for the SQL statement.
Reason: Prepare of EXECUTE IMMEDIATE.
换句话说,消息告诉调用参数列表或SQLDA无效,这与EXECUTE IMMEDIATE命令有关(通常用于动态SQL字符串)。
带有动态查询字符串的 DB2 更新过程应该类似于此示例:
CREATE OR REPLACE PROCEDURE UpdateDDATransferAccount(IN [parameter_name] [data_type](size) ...)
-- query settings
BEGIN
DECLARE statement = VARCHAR(2000) -- size of query string
SET statement = 'UPDATE [schema].' || '[table_name]' || ' SET [field_name] = ' || '[parameter_name]' || ' ... ' WHERE ' || '[field_name]' || ' = ' || '[parameter_name_or_value]';
EXECUTE IMMEDIATE statement;
END;
类似问题: