c # Вставить более 32767 строк IBM400 - PullRequest
0 голосов
/ 05 октября 2018

Пытаясь вставить более 32767 строк, я получаю ошибки ... Как я могу увеличить этот лимит?

Спасибо за ваше время!

SQL0221 Количество ошибок без проверки.

(номера строк SQL0221 недействительны.)

Номера строк - 104328 (param.Count)

((IBM.Data.DB2.iSeries.iDB2Exception) ex).MessageDetails:
Причина.,,: Инструкция FETCH заблокирована, INSERT заблокирован или SET RESULT SETS недействительны.Число указанных строк не должно быть от 0 до 32767 или больше размера хоста хоста.Количество указанных строк и размер массива.Если это инструкция FETCH, имя курсора будет ??lÜ * N.
Fix .: убедитесь, что количество строк находится в диапазоне от 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 голосов
/ 08 октября 2018

На основании сообщения об ошибке существует ограничение на количество строк в заблокированных операторах.Это заявления INSERT, FETCH и SET RESULT SETS.Предел меньше 32 767 или количество элементов в вашем массиве хоста.Если вы вставляете строки из массива хоста, то максимум, что вы можете вставить за один снимок, - это 32 767 (если ваш массив может с этим справиться).Если вам нужно вставить 100 000 строк, вам придется разделить их.Единственное место, где я могу найти это документально, - это само сообщение https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzala/rzalaml.htm.

0 голосов
/ 05 октября 2018

Похоже, что для вставки z / OS установлено ограничение 32767 строк на заблокированную вставку.https://www.ibm.com/support/knowledgecenter/en/SSEPEK_11.0.0/sqlref/src/tpc/db2z_sql_insert.html

Однако соответствующая документация для IBM i не устанавливает такое же ограничение.Вполне возможно, что оно существует и просто не задокументировано.https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/db2/rbafzbackup.htm

Это ограничение может также зависеть от версии ОС, на которой работает ваша система IBM i.

Обновление: согласно ответу jmarkmurphy, похоже, что IBM имеет ограничениея тоже.

0 голосов
/ 06 октября 2018

Мне кажется, что вы можете столкнуться с настройкой максимального количества записей в таблице, в которую вы вставляете;вам нужно увеличить это (команда CHGPF).В этом случае в журнале истории появится соответствующее сообщение (DSPLOG).

0 голосов
/ 05 октября 2018

Я на самом деле понятия не имею, что вы пытаетесь сделать.Я не знаю, что такое 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 ();"была причина проблемы.

Может быть, вы вынуждены добавить их ВСЕ и сразу отправить ВСЕ, и в этом случае мое решение не будет работать.

Однако, если нет, надеюсь, выможет реализовать логику, которую я использовал при попытке уклониться от максимального предельного размера

...