![](/img/trans.png)
[英]INSERT more than 1000 rows into SQL Server database from JSON in C# code
[英]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;
}
根據錯誤消息,對被阻止的語句有行限制。 這些語句是INSERT
, FETCH
和SET 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.