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 中国語 Web サイトの他の関連記事を参照してください。