System.ArgumentException: 另一個SqlParameterCollection中已包含SqlParameter。
一般情況下,我們定義的一個SqlParameter引數陣列,如:
SqlParameter[] parms =
{
new SqlParameter("@DateTime1", dtBegin),
new SqlParameter("@DateTime2", dtEnd)
};
如果只給一個SqlCommand使用,這種情況的引數使用,不會出現異常,但如果該引數陣列同時給兩個Sqlcommand使用,就會出現如下異常:
System.ArgumentException: 另一個SqlParameterCollection中已包含SqlParameter。
原因如下:宣告的SqlParameter陣列,而在迴圈的內部,每一次執行ExecuteNonQuery(或者其它命令方法)都由該方法內部的IDbCommand.Parameters.Add(IDbDataParameter)將SqlParameter陣列新增到IDbCommand的IDataParameterCollection中。而framework機制限制兩個IDataParameterCollection指向同一個對象。雖然ExecuteNonQuery方法內部宣告瞭一個IDbCommand的臨時物件,理論上講,這個包含了IDataParameterCollection的IDbCommand物件會在ExecuteNonQuery方法結束時從記憶體中釋放。但是實際上可能是由於垃圾回收機制並沒有將IDbCommand臨時物件即時的回收,而且改物件繫結的Parameter集合也存在,就像一個DropDownList新增Item一樣。這樣在下一個迴圈執行的時候,會導致兩個IDataParameterCollection指向同一個物件,此時出現問題。
解決方案一:在每一次迴圈時,重新生成物件,但這樣會產生大量的垃圾變數,不可取。
解決方案二:將使用完之後的Command命令的Parameters集合清空。推薦使用,類似程式碼如下:
/// <summary>
/// 獲取一個DataTable
/// </summary>
public static DataTable GetDataTable(
string connDBStr, string sql, params SqlParameter[] cmdParms)
{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(connDBStr))
{
PrepareSqlCommand(cmd, conn, null, sql, cmdParms);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable (SetSqlAsDataTableName(sql));
da.Fill(dt);
cmd.Parameters.Clear();//多了這一句,就解決了問題
return dt;
}
}
另外,如果不是陣列,只是一個SqlParameter變數,如:
SqlParameter parm =
new SqlParameter("@Cust_Id", CustId.Trim());
則多次被SqlCommand使用,不會出現問題,我已經做了試驗!
原文來自:黃永泰 http://www.cnblogs.com/OldYongs/archive/2011/03/12/1982021.html
相關文章
- iOS從0到1| OC 中如何檢查一個字串 string 是否包含另一個 stringiOS字串
- 將個人註冊資訊傳到另一個頁面(包含陣列的傳遞)陣列
- html中引入另一個html的方法HTML
- python中怎麼呼叫另一個程式Python
- 3297. 統計重新排列後包含另一個字串的子字串數目 I字串
- 3298. 統計重新排列後包含另一個字串的子字串數目 II字串
- mysql 從一個表中查詢,插入到另一個表中MySql
- 科學家可能已經發現第一個來自另一個宇宙的“幽靈”黑洞
- 如何在 SAP BTP 平臺上重用另一個已經開發好的 service
- Flink的Job manager中包含了哪三個元件元件
- 如何用python判斷列表中是否包含多個字串中的一個或多個?Python字串
- 將一個Activity中的資料傳到另一個Activity的Fragment中的方法Fragment
- 將DataTable一行放入另一個DataTable中(筆記)筆記
- python怎麼查詢字串中是否包含某個字串Python字串
- Rust for Linux已經包含在PR for 6.1-rc1RustLinux
- js中在一個函式中引用另一個函式中的函式,可以這麼做JS函式
- MongoDB關聯另一個集合MongoDB
- BLUP分析中是否包含缺失系譜資訊的個體
- mongodb查詢資料庫中某個欄位中的值包含某個字串的方法MongoDB資料庫字串
- Rust中如何將本地時間轉換為另一個時區?Rust
- 另一個Android效能剖析工具——simpleperfAndroid
- 樹的另一個構建方式
- 另一個Swoole偵錯程式 - Yasd
- Oracle如何把一個表匯出匯入到另一個伺服器上的另一個表裡Oracle伺服器
- 如何用一個 Excel 過濾另一個 ExcelExcel
- Java中包含哪些運算子Java
- CTF學習(13)MISC(另一個世界)
- javascript 將一個陣列中的元素的值複製到另一個已有資料的陣列中JavaScript陣列
- Sql查詢 一個表中某欄位的資料在另一個表中某欄位中不存在的SQL
- HTML基本結構包含幾個部分?HTML
- 1.17 另一個自定義的CVCalendar日曆 [iOS開發中的神兵利器]iOS
- 將一個陣列複製到另一個陣列上陣列
- 動圖之一個圓繞另一個圓轉動
- RecyclerView學習筆記整理(3)解決item中關於跳轉到另一個Activity的問題和判斷多個item進行跳轉到另一個ActivityView筆記
- Vavr Option:Java Optional 的另一個選項VRJava
- 列表切片賦值給另一個變數賦值變數
- Playwright使用Typescript實現在測試case檔案中呼叫另一個檔案中的方法TypeScript
- Flutter 5個必備的桌面外掛包將包含在你的下一個版本中Flutter
- 往一個陣列物件裡面傳值,如果id已經存在就替換id同一個物件裡面的另一個值。沒有就新增陣列物件