web-dev-qa-db-ja.com

List <string>をSql InステートメントのSqlParameterに変換するにはどうすればよいですか?

InステートメントをSqlParameterで実行する方法について混乱しているようです。これまでのところ、私は次のコードを持っています:

_cmd.CommandText = "Select dscr from system_settings where setting in @settings";
cmd.Connection = conn;
cmd.Parameters.Add(new SqlParameter("@settings", settingList));

reader = cmd.ExecuteReader();
_

settingsListは_List<string>_です。 cmd.ExecuteReader()が呼び出されると、_List<string>_を「既知のプロバイダータイプ」にマップできないため、ArgumentExceptionを取得します。

InsでSqlCommandクエリを(安全に)実行するにはどうすればよいですか?

21
KallDrexx

あなたはこのようなことを試すことができます:

string sql = "SELECT dscr FROM system_settings WHERE setting IN ({0})";
string[] paramArray = settingList.Select((x, i) => "@settings" + i).ToArray();
cmd.CommandText = string.Format(sql, string.Join(",", paramArray));

for (int i = 0; i < settingList.Count; ++i)
{
    cmd.Parameters.Add(new SqlParameter("@settings" + i, settingList[i]));
}
26
Mark Byers

複数の値を持つパラメーターを渡そうとしているように見えますが、そのSQL構文では期待どおりに動作しません。テーブル値パラメーターを渡すことができます。

これを読んでください: http://www.sommarskog.se/arrays-in-sql.html#iter-list-of-strings

特に: http://www.sommarskog.se/arrays-in-sql-2008.html#ListSqlDataRecord

private static void datatable_example() {

   string [] custids = {"ALFKI", "BONAP", "CACTU", "FRANK"};

   DataTable custid_list = new DataTable();
   custid_list.Columns.Add("custid", typeof(String));

   foreach (string custid in custids) {
      DataRow dr = custid_list.NewRow();
      dr["custid"] = custid;
      custid_list.Rows.Add(dr);
   }

   using(SqlConnection cn = setup_connection()) {
      using(SqlCommand cmd = cn.CreateCommand()) {

         cmd.CommandText =
           @"SELECT C.CustomerID, C.CompanyName
             FROM   Northwind.dbo.Customers C
             WHERE  C.CustomerID IN (SELECT id.custid FROM @custids id)";
         cmd.CommandType = CommandType.Text;

         cmd.Parameters.Add("@custids", SqlDbType.Structured);
         cmd.Parameters["@custids"].Direction = ParameterDirection.Input;
         cmd.Parameters["@custids"].TypeName = "custid_list_tbltype";
         cmd.Parameters["@custids"].Value = custid_list;

         using (SqlDataAdapter da = new SqlDataAdapter(cmd))
         using (DataSet        ds = new DataSet()) {
            da.Fill(ds);
            PrintDataSet(ds);
         }
      }
   }
}
9
missaghi

私は自分の関数を使って次のようなパラメータを作成しています:

public void SomeDataFunction() {    
    ArrayList params = GetParameters(someEntity);
    CommandObject.Parameters.AddRange(parameters.ToArray());
}

public static ArrayList GetParameters(ISomeEntity entity) {
    ArrayList result = new ArrayList {                  
            OleDbUtility.NewDbParam("@Param1", OleDbType.Integer, , entity.Parameter1),
            OleDbUtility.NewDbParam("@Param2", OleDbType.VarChar, 9, entity.Parameter2),
        }
}

public static OleDbParameter NewDbParam(string parameterName, OleDbType dataType,
                    int size, object value) {
    OleDbParameter result = new OleDbParameter(parameterName, dataType, size, string.Empty);
    result.Value = value;
    return result;
}
0
ArBR

SQL Server 2008以降を使用している場合は、テーブル値パラメーターを使用できます。これにより、値のテーブルをパラメーターとして渡すことができます。 .netから「構造化」タイプのSqlParameterを定義し、IEnumerableを実装するものに値を設定します。

ここで例を含む完全なMSDNリファレンスを参照してください: http://msdn.Microsoft.com/en-us/library/bb675163.aspx

0
AdaTheDev