簡體   English   中英

c#插入超過32767行IBM400

[英]c# Insert more than 32767 rows IBM400

嘗試插入超過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;
            }

根據錯誤消息,對被阻止的語句有行限制。 這些語句是INSERTFETCHSET RESULT SETS 該限制是32,767或主機陣列中的元素數中的較小者。 如果要從主機陣列插入行,則一次插入最多可以插入32,767(只要您的陣列可以處理)。 如果您需要插入100,000行,則必須將其拆分。 我可以找到此文檔的唯一位置是消息本身https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzala/rzalaml.htm

看起來z / OS插入在阻塞的插入上有32767行的限制。 https://www.ibm.com/support/knowledgecenter/zh-CN/SSEPEK_11.0.0/sqlref/src/tpc/db2z_sql_insert.html

但是,IBM i的相應文檔沒有規定相同的限制。 它可能存在,但是沒有記錄。 https://www.ibm.com/support/knowledgecenter/zh-CN/ssw_ibm_i_73/db2/rbafzbackup.htm

此限制還可能取決於您正在運行IBM i系統的OS的版本。

更新:根據jmarkmurphy的回答,似乎對IBM i也有限制。

我實際上不知道您要做什么。 我不知道什么是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();” 是問題的原因。

也許您被迫將它們全部添加並立即發送所有,在這種情況下,我的解決方案將無法工作。

但是,如果沒有,希望您可以實現我在嘗試躲避最大限制大小時使用的邏輯

在我看來,好像您要插入要插入的表的“最大記錄數”設置一樣; 您需要增加它(CHGPF命令)。 如果是這種情況,歷史記錄日志(DSPLOG)中將有一條相關消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM