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
相關文章
- C#中SqlParameter的作用與用法C#SQL
- SqlParameter的用法SQL
- csss中box-sizing的問題 元素在另一個元素中框框包含的問題CSS
- iOS從0到1| OC 中如何檢查一個字串 string 是否包含另一個 stringiOS字串
- html中引入另一個html的方法HTML
- not in 中包含null值是個悲劇Null
- 將個人註冊資訊傳到另一個頁面(包含陣列的傳遞)陣列
- mysql 從一個表中查詢,插入到另一個表中MySql
- python中怎麼呼叫另一個程式Python
- java程式中編譯另一個java程式Java編譯
- 3297. 統計重新排列後包含另一個字串的子字串數目 I字串
- 3298. 統計重新排列後包含另一個字串的子字串數目 II字串
- 判斷某一個字串是否存在另一個字串中字串
- linux ar 打包庫到另一個庫中Linux
- 在一個js檔案中引入另一個js檔案JS
- python中如何判斷list中是否包含某個元素Python
- 如何將一個陣列中的元素插入另一個陣列陣列
- 如何在js中判斷是否包含某個字串JS字串
- 包含中文的字串中擷取前N個字元字串字元
- 如何在 SAP BTP 平臺上重用另一個已經開發好的 service
- 如何在一個.ear檔案中同時包含兩個.war?
- 將一個Activity中的資料傳到另一個Activity的Fragment中的方法Fragment
- 把一個一中的欄位更新另一個表中的t-sqlSQL
- 如何用python判斷列表中是否包含多個字串中的一個或多個?Python字串
- 將DataTable一行放入另一個DataTable中(筆記)筆記
- 如何將一個HTML頁面巢狀在另一個頁面中HTML巢狀
- SQL1047N 應用程式已經與另一個資料庫相連。SQL資料庫
- js中在一個函式中引用另一個函式中的函式,可以這麼做JS函式
- BLUP分析中是否包含缺失系譜資訊的個體
- Flink的Job manager中包含了哪三個元件元件
- 雙主鍵,,查詢不在另一個表中的記錄
- python怎麼查詢字串中是否包含某個字串Python字串
- 另一個Lambda表示式教程
- MongoDB關聯另一個集合MongoDB
- mongodb查詢資料庫中某個欄位中的值包含某個字串的方法MongoDB資料庫字串
- Rust for Linux已經包含在PR for 6.1-rc1RustLinux
- Rust中如何將本地時間轉換為另一個時區?Rust
- Sql Server 匯入另一個資料庫中的表資料SQLServer資料庫