2017-09-12 4 views
1

私は識別子で構成される文字列配列を持っています。私は、これらの識別子を使用してSQLからいくつかの値を取得したい。文字列の値をSqlCommandのパラメータに追加する方法はありますか?SQLクエリに文字列配列を追加する

私のようなクエリを作成したい:

select CaseList from MasterReportData where Id = 1 OR Id = 2 OR Id = 3 

これは私のC#のコードです:

public static List<string> GetCaseList(string[] masterIdList) 
    { 

     try 
     { 
      string query = " select CaseList from MasterReportData where @masterId"; 
      SqlConnection conn = new SqlConnection(connString); 
      SqlCommand cmd = new SqlCommand(query, conn); 
      cmd.Parameters.AddWithValue("masterId", ***); 
      conn.Open(); 
      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        list.Add(reader[0].ToString()); 
       } 
      } 
      conn.Close(); 
     } 
     catch (Exception e) 
     { 
      var err= 0; 
     } 
     return list; 
    } 
+0

可能な重複しているC#の

var table = ids .Select(i => { var row = new SqlDataRecord(tableSchema); row.SetInt32(0, i); return row; }) .ToList(); 

作成でテーブルを作成します。 [ループ内のSQLパラメータ](https://stackoverflow.c)/QS/24561055/sql-parameters-in-a-loop) –

+0

[SqlCommandで渡すパラメーター](https://stackoverflow.com/questions/2377506/pass-array-parameter-in-sqlcommand) –

+0

@ RufusLはい私は欲しい、またはオペレーター、私は編集した。 – MsK

答えて

-1
public static List<string> GetCaseList(string[] masterIdList) 
    { 
     List<string> list = new List<string>(); 
     try 
     { 
      string query = "select CaseList from MasterReportData where "; 
      using (SqlConnection conn = new SqlConnection(connString)) 
      { 
       int i = 0; 
       SqlCommand cmd = new SqlCommand(query, conn); 
       for(i = 0; i < masterIdList.Length; i++) 
       { 
        var parm = "@ID" + i; 
        cmd.Parameters.Add(new SqlParameter(parm, masterIdList[i])); 
        query += (i > 0 ? " OR " : "") + " Id = " + parm; 
       } 
       cmd.CommandText = query; 
       //cmd.Parameters.AddWithValue("masterId", ***); 
       conn.Open(); 
       using (SqlDataReader reader = cmd.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         list.Add(reader[0].ToString()); 
        } 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      e.ToString(); 
     } 
     return list; 
    } 
+0

"AND"ではなく "OR"を意味すると思いますが、必要に応じて用途に合わせて変更してください... – wdomains

+0

SQL Serverは最大2100のパラメータを許可しますので、masterIdList.Lengthが> 0および<= 2100であることを確認したい場合があります。 – mjwills

+0

非常に真実です。上記の方法は、パラメータリストが長くなる – wdomains

1

あなたがこれをやって行くことができますが、私は一時を作成することを好む多くの異なる方法があります。可能な値の表。あなたは

select CaseList from MasterReportData where Id IN(select Id from tempTable) 
+3

'SqlParameter'と[Table-Valued Parameter Types](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/table-japan/)を使用することで、値付きパラメータ) – Fabio

+1

Inクエリはすべての結果サブクエリをフェッチします。私はあなたがExistクエリを使用すると思います。より高速に存在し、クエリ中に存在します。 –

+0

あなたの良い点。正直言って私はいくつかの深刻なSQLを行って以来、しばらくしているので、私は少し錆びています! –

0

(SQLの最適化)最善のアプローチのような何かを行うことができますこの方法は、次のようになります。

あなたのタイプを作成します。

CREATE TYPE dbo.IntTTV AS TABLE 
(Id int) 

あなたのIds:

var ids = new List<int> 
{ 
    1, 
    2, 
    3, 
} 

スキーマの作成:

var tableSchema = new List<SqlMetaData>(1) 
{ 
    new SqlMetaData("Id", SqlDbType.Int) // I think it's Int 
}.ToArray(); 

SQLパラメータ少し

var parameter = new SqlParameter(); 
parameter.SqlDbType = SqlDbType.Structured; 
parameter.ParameterName = "@Ids"; 
parameter.Value = table; 
parameter.TypeName = "dbo.IntTTV"; 

var parameters = new SqlParameter[1] 
{ 
    parameter 
}; 

あなたのクエリを変更する(これは単なる例:)

string query = "select mrd.CaseList from MasterReportData mrd" 
    + " inner join @ids i on mrd.Id = i.id"; 
関連する問題