2013-11-22 2 views
5

は、私は次のクエリを必要としています。SqlParameterと文で

擬似コード:

createList(string commaSeparatedElements) { 
    ... 
    SqlParameterList elements = new SqlParameterList("@elements", SqlDbType.Int); 
    SqlParameterList.Values = commaSeparatedElements.split(new Char[1] {','}); 
    SqlCommand query = new SqlCommand("SELECT * FROM table WHERE id IN (@elements)"); 
    query.Parameters.Add(elements); 
    ... 
} 

そのようなものは、C#で存在するか、または私は自分でそれを書くことがあるのだろうか?

編集:すべての回答ありがとうございます。私が理解できないコードを使用しないようにすると(最終日にあまりにも多くの悪い経験をすると)、大まかに、テーブル値のパラメータは、自分のニーズに合っていてもオフリミットです。私はちょうどループを作りました。あなたは

List<int> Ids = new List<int>(); 

を宣言し、そこにあなたがしたいIDを追加した場合

string[] elements = commaSeparatedElements.split(new Char[1] {','}); 
StringList idParamList = new StringList(); 
for(int i=0;i<elements.Count;i++) { 
    query.Parameters.AddWithValue("@element"+i,Convert.ToInt32(elements[i])); 
    idParamList.Add("@element" + i); 
} 
SqlCommand query = new SqlCommand("SELECT * FROM table WHERE id IN ("+String.Join(",",idParamList)+")"); 
+1

自分で書く –

+0

[これをチェック](http://stackoverflow.com/questions/4502821/how-do-i-translate-a-liststring-into-a-sqlparameter-for-a-sql-in-statement) ) –

答えて

1

のSQL Server 2008以降

チェックを使用している場合 あなたは、テーブル値パラメータを試してみる必要がありますこの

string sql = "SELECT col1 " + 
      "FROM Table " + 
      "WHERE col2 IN ({@Values}) "; 
var paramNames = SqlHelper.AddParameters(command.Parameters, 
             "@Value0", 
             SqlDbType.Int, 
             0, 
             listOfInts); 
command.CommandText = sql.Replace("{@Values}", paramNames); 
... 

(結果はSELECT ... IN (@Value0, @Value1, @Value2)のようなクエリである)

2

string listOfIds = string.Join(",", Ids.Select(Id => Id.ToString()).ToArray()); 

この文字列をパラメーター化されたクエリにパラメーターとして渡すと、カンマ区切りリストで簡単に変換できます。

+1

私はドンが働いていませんSELECT * FROM table WHERE id IN( "1,2,3") '、私は' SELECT * FROM table WHERE id IN(1,2,3) 'と答えます。 – Alexander

3

SQL Serverには、同じ「種類」の複数の値を保持するのに理想的なデータ構造が1つあります。これはテーブルです。あなたのクライアントコードでテーブルを作成し、自然な方法でSQL Serverに渡ってそれを渡すことができるように、近年では、彼らは、例えばTable-Valued Parametersを導入ありがたい

、:

// Assumes connection is an open SqlConnection. 
using (connection) 
{ 
// Create a DataTable with the modified rows. 
DataTable addedCategories = CategoriesDataTable.GetChanges(
    DataRowState.Added); 

// Define the INSERT-SELECT statement. 
string sqlInsert = 
    "INSERT INTO dbo.Categories (CategoryID, CategoryName)" 
    + " SELECT nc.CategoryID, nc.CategoryName" 
    + " FROM @tvpNewCategories AS nc;" 

// Configure the command and parameter. 
SqlCommand insertCommand = new SqlCommand(
    sqlInsert, connection); 
SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(
    "@tvpNewCategories", addedCategories); 
tvpParam.SqlDbType = SqlDbType.Structured; 
tvpParam.TypeName = "dbo.CategoryTableType"; 

// Execute the command. 
insertCommand.ExecuteNonQuery(); 
} 
+0

これは最善の方法ですが、 TVPは、パラメータスニッフィングのためにストアドプロシージャを吸うことができます。 –

-1

代わりにあなたが置くことができますパラメータのif条件。例:

if(commaSeparatedElements.Contains("'")) 
    return; 
else 
    //Pass parameter & Execute query 
1

使用しているSQL Serverのバージョンは?あなたは、私はそれは次のように使用されている。この

/// <summary> 
/// Adds a sequence of parameters to an existing parameter collection 
/// </summary> 
/// <typeparam name="T">Type of parameter values</typeparam> 
/// <param name="parameters">Existing parameter collection</param> 
/// <param name="pattern">Name pattern of parameters. Must be a valid <see langword="int"/> format string</param> 
/// <param name="parameterType">Database type of parameters</param> 
/// <param name="length">Length of parameter. 0 for numeric parameters</param> 
/// <param name="values">Sequence of values</param> 
/// <returns>Comma separated string of parameter names</returns> 
public static string AddParameters<T>(SqlParameterCollection parameters, 
             string pattern, 
             SqlDbType parameterType, 
             int length, 
             IEnumerable<T> values) { 
    if (parameters == null) 
     throw new ArgumentNullException("parameters"); 
    if (pattern == null) 
     throw new ArgumentNullException("pattern"); 
    if (values == null) 
     throw new ArgumentNullException("values"); 
    if (!pattern.StartsWith("@", StringComparison.CurrentCultureIgnoreCase)) 
     throw new ArgumentException("Pattern must start with '@'"); 

    var parameterNames = new List<string>(); 
    foreach (var item in values) { 
     var parameterName = parameterNames.Count.ToString(pattern, CultureInfo.InvariantCulture); 
     parameterNames.Add(parameterName); 
     parameters.Add(parameterName, parameterType, length).Value = item; 
    } 

    return string.Join(",", parameterNames.ToArray()); 
} 

のようなヘルパーメソッドを使用しhttp://www.codeproject.com/Articles/39161/C-and-Table-Value-Parameters

Pass table valued parameter using ADO.Net

8

"dapper"は、このためのいくつかのブードゥー教を持っています

var ids = new List<int> {1,2,3,4,5}; 
var rows = conn.Query<SomeType>("select * from table where id in @ids", 
     new { ids }).ToList(); 

あなたはin、使用中括弧の欠如に気付くでしょう。 "dapper"はこれを特定し、自動的にパラメータ拡張を実行します。さらに、SomeTypeインスタンスにデータをマッピングするなど、すべてのコマンドの詳細を処理します。

上記の例では、それは(約)に相当すると拡大しますが:

int ids0 = 1, ids1 = 2, ids2 = 3, ids3 = 4, ids4 = 5; 
var rows = conn.Query<SomeType>(
    "select * from table where id in (@ids0,@ids1,@ids2,@ids3,@ids4)", 
     new { ids0, ids1, ids2, ids3, ids4 }).ToList(); 
0

これは、私は1つのプロジェクトで行ったものである:

 StringBuilder sb = new StringBuilder("Id IN("); 
     List<SqlParameter> parameters = new List<SqlParameter>(); 
     int i = 1; 

     foreach (int item in items) 
     { 
      string currentItem = "@Item" + i++.ToString(); 
      sb.Append(currentItem + ","); 
      parameters.Add(new SqlParameter(currentItem , item)); 
     } 
     sb.Remove(sb.Length-1, 1); 

     sb.Append(")"); 

私はこれが役に立てば幸い

関連する問題