4 Stimmen

Verwendung eines 'IN'-Operators mit einem SQL-Befehlsobjekt und C# 2.0

Ich möchte eine Sql-Anweisung aufrufen wie:

Select * From Table Where Column in ('value1', 'value2', 'value3')

Ist es so einfach, den Wert eines Befehlsparameters auf " ('value1', 'value2', 'value3') "?

5voto

David Punkte 51

@Charles: Sie gehen in die richtige Richtung, aber wir verwenden parametrisierte Abfragen, um hauptsächlich SQL-Injections zu verhindern. Das Einfügen von 'externen' Werten ( params string[] args ) in Abfragen fest einkodiert sind, sind Probleme vorprogrammiert. Sie können die Argumente iterieren, aber Sie müssen trotzdem Parameter wie diesen verwenden:

   string[] values = new [] {"value1", "value2", "value3", "value4"};
   StringBuilder query = new StringBuilder("Select * From Table Where Column in (");
   SqlCommand cmd = new SqlCommand();
   cmd.Connection = new SqlConnection("Your connection string");
   for(int i = 0; i < columns.Length; i++)
   {
       string arg = string.Format("@arg{0}", i);
       cmd.Parameters.AddwithValue(arg, SanatizeSqlString(columns[i]));
       sb.AppendFormat("{0}, ", arg);
   }
   sb = sb.Remove(sb.Length -2, 2);
   sb.Append(")");
   cmd.CommandText = sb.ToString();

Auf diese Weise erhalten Sie eine Abfrage wie diese:

select * from table where column in (@arg0, @arg1, @arg2, @arg3)

0voto

JoshBerke Punkte 64214

Wenn Sie nur drei Parameter für die in-Klausel haben, können Sie die Parameter verwenden. Ansonsten können Sie dynamisches SQL erstellen (Vorsicht vor SQL-Injection-Angriffen).

Ein anderer Ansatz besteht darin, eine UDF zu erstellen, die eine begrenzte Zeichenkette annimmt und eine Tabelle zurückgibt:

select * from 
table inner join
dbo.fn_stringToTable(@params)

0voto

Charles Bretana Punkte 137391

Eine andere Möglichkeit besteht darin, den Commandtype des SqlCommand auf "text" zu setzen und den gesamten Sql-String im Code zu konstruieren... Angenommen, Column ist ein varchar, und Sie haben die Werte in einem String-Array mit dem Namen "paramValues".

       StringBuilder sbSql = new StringBuilder
                   ("Select * From Table Where Column in (");
       string[] paramValues = new string[] {"value1", "value2", "value3"};
       foreach (string val in paramValues)
          sbSql.Append("'" + val + "', ");
       sbSql = sbSql.Remove(sbSql.Length - 2, 2);
       sbSql.Append(")");

       SqlCommand cmd = new SqlCommand(sbSql.ToString());
       cmd.CommandType = CommandType.Text;

-1voto

Deepak Punkte 2269

Auch wenn die anderen Antworten hilfreich sind, gibt es noch eine weitere einfache Möglichkeit, die Sie nutzen können string.Format .

Angenommen, Sie haben einen SQL-Befehl wie SELECT * FROM TABLE WHERE Id IN ('1', '2', '3') :

var IdList = new List<int>() { 1, 2, 3 };
SqlCommand command = new SqlCommand(string.Format("SELECT * FROM TABLE WHERE Id IN ('{0}')", string.Join("', '", IdList)), connection);

Das war's. Mit einem Einzeiler können Sie die Verwendung des IN-Operators erreichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X