2017-09-12 5 views
1

J'ai un tableau de chaînes composé d'identificateurs. Je veux obtenir des valeurs de SQL en utilisant ces identifiants. Y at-il un moyen de les ajouter avec une valeur de chaîne à SqlCommand paramètres?Ajouter un tableau de chaînes à une requête SQL

Je veux créer une requête comme:

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

Ceci est mon code 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

en double possible de [Paramètres SQL à l'intérieur d'une boucle] (https: //stackoverflow.c om/questions/24561055/sql-paramètres-dans-une-boucle) –

+0

Voir [Pass Array Parameter dans SqlCommand] (https://stackoverflow.com/questions/2377506/pass-array-parameter-in-sqlcommand) –

+0

RufusL oui je veux ou opérateur, j'ai édité. – MsK

Répondre

-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

Je pense que vous vouliez dire "OU" plutôt que "ET" mais modifiez au besoin pour vos usages ... – wdomains

+0

SQL Server autorisera jusqu'à 2100 paramètres, donc vous voudrez peut-être vérifier que 'masterIdList.Length' est> 0 et <= 2100. – mjwills

+0

Très vrai - ce qui précède n'est pas le moyen idéal de le faire si la liste de paramètres est longue – wdomains

1

Il y a beaucoup de façons différentes que vous pouvez aller sur le faire, mais je préfère créer une température tableau des valeurs possibles. De cette façon, vous pouvez faire quelque chose comme

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

Il n'y a réellement qu'une seule approche "correcte" - en utilisant 'SqlParameter' et [Types de paramètres de table] (https://docs.microsoft.com/fr-fr/dotnet/framework/data/adonet/sql/table- valeur-paramètres) – Fabio

+1

Dans la requête ira chercher tous les résultats subQuery. Je pense que vous utiliserez la requête Exist. Existe plus vite que dans la requête. –

+0

Bon point tous les deux. Pour être honnête, ça fait un moment que j'ai fait du SQL sérieux, donc je suis un peu rouillé! –

0

La meilleure approche (avec optimisation SQL) serait:

Créez votre Type:

CREATE TYPE dbo.IntTTV AS TABLE 
(Id int) 

Votre Ids:

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

Créer un schéma:

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

Créer la table en C#

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

Créer SQL paramètre

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

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

changer légèrement votre requête (ce qui est juste un exemple :)

string query = "select mrd.CaseList from MasterReportData mrd" 
    + " inner join @ids i on mrd.Id = i.id";