c#插入超过32767行IBM400

时间:2018-10-05 12:15:26

标签: c# ibm-midrange

尝试插入超过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;
            }

4 个答案:

答案 0 :(得分:3)

根据错误消息,被阻止的语句有行限制。这些语句是INSERTFETCHSET 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)中将显示一条相关消息。