在C#中傳遞陣列參數給SqlCommand
在C#中,嘗試向SQL指令傳遞陣列參數時,可能會出現無法如預期運作的問題。根本原因在於無法直接將陣列作為參數新增至SqlCommand。為了解決這個問題,必須單獨添加數組中的每個值。
解:
定義陣列參數:
建立具有所需名稱和資料類型的參數數組。
將參數加入SqlCommand:
對於陣列中的每個值,新增一個新的SqlParameter對象,並指定對應的名稱和值。如有必要,設定適當的SqlDbType和大小。
替換IN子句:
將CommandText中的"{parameterNameRoot}"佔位符替換為參數名稱的逗號分隔清單。
範例:
<code class="language-csharp">var parameters = new string[items.Length]; // 此处items应替换为实际的数组变量 var cmd = new SqlCommand(); for (int i = 0; i < items.Length; i++) { cmd.Parameters.AddWithValue("@param" + i, items[i]); } cmd.CommandText = cmd.CommandText.Replace("{param}", string.Join(",", Enumerable.Range(0, items.Length).Select(i => "@param" + i)));</code>
改良的解決方案:
一個改進的、可重複使用的解決方案可以實現為擴展方法:
<code class="language-csharp">public static class SqlCommandExt { public static SqlParameter[] AddArrayParameters<T>(this SqlCommand cmd, string paramNameRoot, IEnumerable<T> values, SqlDbType? dbType = null, int? size = null) { var parameters = new List<SqlParameter>(); var parameterNames = new List<string>(); var paramNbr = 1; foreach (var value in values) { var paramName = string.Format("@{0}{1}", paramNameRoot, paramNbr++); parameterNames.Add(paramName); var p = new SqlParameter(paramName, value); if (dbType.HasValue) p.SqlDbType = dbType.Value; if (size.HasValue) p.Size = size.Value; cmd.Parameters.Add(p); parameters.Add(p); } cmd.CommandText = cmd.CommandText.Replace("{" + paramNameRoot + "}", string.Join(",", parameterNames)); return parameters.ToArray(); } }</code>
使用方法:
<code class="language-csharp">var cmd = new SqlCommand("SELECT * FROM TableA WHERE Age IN ({Age})"); cmd.AddArrayParameters("Age", new int[] { 1, 2, 3 });</code>
這個改進的範例使用了泛型,使其更靈活,並允許指定SqlDbType和Size。 它也避免了在CommandText中直接拼接參數名稱的潛在安全風險。 請記住,在實際使用中,替換TableA
和Age
為你的實際表名和列名。
以上是如何在 C# 中將陣列參數傳遞給 SqlCommand?的詳細內容。更多資訊請關注PHP中文網其他相關文章!