尝试插入超过32767行时出现错误...如何增加此限制?
感谢您的时间!
SQL0221无效验证。
(SQL0221行编号无效。)
行数为104328(参数计数)
(((IBM.Data.DB2.iSeries.iDB2Exception)ex).MessageDetails:
原因。 。 。 :FETCH指令被阻止,INSERT被阻止或SET RESULT SETS无效。指定的行数不在0到32767之间,或者大于主机的主机大小。指定的行数是和数组的大小。如果这是一条FETCH指令,则游标名称为??。 lÜ* N.
修正:确保行数在0到32767之间,并且小于或等于数组的大小,或者增加数组的大小。
using (iDB2Connection cnn = new iDB2Connection(Db2ConStr))
{
iDB2Transaction trans = null;`enter code here`
iDB2Command cmd = null;
try
{
//cnn = new iDB2Connection(Db2ConStr);
cmd = new iDB2Command
{
Connection = cnn,
CommandText = sInsertSql
};
cnn.Open();
cmd.DeriveParameters();
// Insert 10 rows of data at once
for (int i = 0; i < param.Count; i++)
{
// Here, you set your parameters for a single row
cmd.Parameters["@SETTORE_GESTIONALE"].Value = param[i].SETTORE_GESTIONALE;
cmd.Parameters["@RAPPORTO_GESTIONALE"].Value = param[i].RAPPORTO_GESTIONALE ;
cmd.Parameters["@DATA_RIFERIMENTO"].Value = param[i].DATA_RIFERIMENTO ;
cmd.Parameters["@FLAG_AFFIDATO_CASSA"].Value = param[i].FLAG_AFFIDATO_CASSA;
cmd.Parameters["@FLAG_AFFIDATO_SBF"].Value = param[i].FLAG_AFFIDATO_SBF ;
cmd.AddBatch();
}
trans = cnn.BeginTransaction();
cmd.Transaction = trans;
int rowsUpdated = cmd.ExecuteNonQuery();
trans.Rollback();
//trans.Commit();
cnn.Close();
return true;
}
catch (Exception ex)
{
trans.Rollback();
cnn.Close();
Log.TraceOnFilesystem(ex);
Log.TraceOnFilesystem(sInsertSql);
return false;
}
答案 0 :(得分:3)
根据错误消息,被阻止的语句有行限制。这些语句是INSERT
,FETCH
和SET RESULT SETS
。该限制是32,767或主机阵列中的元素数中的较小者。如果要从主机阵列插入行,则一次插入最多可以插入32,767(只要您的阵列可以处理)。如果您需要插入100,000行,则必须将其拆分。我唯一可以找到此文档的地方是消息本身https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzala/rzalaml.htm。
答案 1 :(得分:1)
z / OS插入似乎在被阻止的插入上有32767行的限制。 http://localhost:3000/home/Test
但是,IBM i的相应文档没有规定相同的限制。它可能存在,但是没有记录。 https://www.ibm.com/support/knowledgecenter/en/SSEPEK_11.0.0/sqlref/src/tpc/db2z_sql_insert.html
此限制还可能取决于您运行IBM i系统的操作系统的版本。
更新:根据jmarkmurphy的回答,似乎对IBM i也有限制。
答案 2 :(得分:0)
我实际上不知道您要做什么。我不知道什么是IBM400或如何使用它,但是我想以下也许是一种解决方案?
try
{
//cnn = new iDB2Connection(Db2ConStr);
cmd = new iDB2Command
{
Connection = cnn,
CommandText = sInsertSql
};
cnn.Open();
cmd.DeriveParameters();
int index;
while(index < parms.Count)
{
cmd.DeriveParameters();
// Insert 10 rows of data at once
// Here, you set your parameters for a single row
cmd.Parameters["@SETTORE_GESTIONALE"].Value = param[i].SETTORE_GESTIONALE;
cmd.Parameters["@RAPPORTO_GESTIONALE"].Value = param[i].RAPPORTO_GESTIONALE ;
cmd.Parameters["@DATA_RIFERIMENTO"].Value = param[i].DATA_RIFERIMENTO ;
cmd.Parameters["@FLAG_AFFIDATO_CASSA"].Value = param[i].FLAG_AFFIDATO_CASSA;
cmd.Parameters["@FLAG_AFFIDATO_SBF"].Value = param[i].FLAG_AFFIDATO_SBF ;
cmd.AddBatch();
if(index % 32767 == 0 || index == params.Count() - 1)
{
trans = cnn.BeginTransaction();
cmd.Transaction = trans;
int rowsUpdated = cmd.ExecuteNonQuery();
trans.Rollback();
cmd = new iDB2Command
{
Connection = cnn,
CommandText = sInsertSql
};
}
index++;
}
我不知道您从哪里获得异常,所以我猜到了“ cmd.ExecuteNonQuery();”是造成问题的原因。
也许您被迫将它们全部添加并立即发送所有,在这种情况下,我的解决方案将无法工作。
但是,如果没有,希望您可以实现我在尝试躲避最大限制大小时所使用的逻辑
答案 3 :(得分:-1)
在我看来,您好像要违反要插入的表的“最大记录”设置;您需要增加它(CHGPF命令)。如果是这种情况,历史记录日志(DSPLOG)中将显示一条相关消息。