Ich versuche, Array-Parameter wie unten beschrieben an SQL-Befehl in C # zu übergeben, aber es funktioniert nicht. Trifft es jemand schon einmal?
string sqlCommand = "SELECT * from TableA WHERE Age IN (@Age)";
SqlConnection sqlCon = new SqlConnection(connectString);
SqlCommand sqlComm = new SqlCommand();
sqlComm.Connection = sqlCon;
sqlComm.CommandType = System.Data.CommandType.Text;
sqlComm.CommandText = sqlCommand;
sqlComm.CommandTimeout = 300;
sqlComm.Parameters.Add("@Age", SqlDbType.NVarChar);
StringBuilder sb = new StringBuilder();
foreach (ListItem item in ddlAge.Items)
{
if (item.Selected)
{
sb.Append(item.Text + ",");
}
}
sqlComm.Parameters["@Age"].Value = sb.ToString().TrimEnd(',');
Antworten:
Sie müssen die Werte einzeln im Array hinzufügen.
UPDATE: Hier ist eine erweiterte und wiederverwendbare Lösung, die Adams Antwort zusammen mit seiner vorgeschlagenen Bearbeitung verwendet. Ich habe es ein wenig verbessert und es zu einer Erweiterungsmethode gemacht, um das Aufrufen noch einfacher zu machen.
Es heißt so ...
Beachten Sie, dass das "{Age}" in der SQL-Anweisung mit dem Parameternamen übereinstimmt, den wir an AddArrayParameters senden. AddArrayParameters ersetzt den Wert durch die richtigen Parameter.
quelle
var paramPlaceholder = "{" & paramNameRoot & "}";
Debug.Assert(cmd.CommandText.Contains(paramPlaceholder), "Parameter Name Root must exist in the Source Query");
Dies sollte Entwicklern helfen, wenn sie vergessen, paramNameRoot mit der Abfrage abzugleichen.Ich wollte die Antwort erweitern, die Brian dazu beigetragen hat, dies an anderen Orten leicht nutzbar zu machen.
Sie können diese neue Funktion wie folgt verwenden:
Bearbeiten: Hier ist eine generische Variante, die mit einem Array von Werten eines beliebigen Typs funktioniert und als Erweiterungsmethode verwendet werden kann:
Sie können diese Erweiterungsmethode dann wie folgt verwenden:
Stellen Sie sicher, dass Sie den CommandText festlegen, bevor Sie AddArrayParameters aufrufen.
Stellen Sie außerdem sicher, dass Ihr Parametername teilweise nicht mit anderen Elementen in Ihrer Anweisung übereinstimmt (z. B. @AgeOfChild).
quelle
AddWithValue
Funktion. Gibt es eine Chance, dass Sie das beheben können?Wenn Sie ein Tool wie "dapper" verwenden können, kann dies einfach sein:
Dapper übernimmt das Auspacken in einzelne Parameter für Sie .
quelle
'{1,2,3}'
für eine Funktion behandelt (keine WHERE IN-Klausel), aber ich würde lieber einfaches ODBC verwenden, wenn nicht Array Ärger. Ich nehme an, ich würde in diesem Fall auch Dapper ODBC benötigen. Hier ist was es ziehen will. snipboard.io/HU0RpJ.jpg . Vielleicht sollte ich mehr über Dapper lesen ...Wenn Sie MS SQL Server 2008 und höher verwenden, können Sie tabellenwertige Parameter verwenden, wie hier beschrieben: http://www.sommarskog.se/arrays-in-sql-2008.html .
1. Erstellen Sie einen Tabellentyp für jeden Parametertyp, den Sie verwenden
Der folgende Befehl erstellt einen Tabellentyp für Ganzzahlen:
2. Implementieren Sie Hilfsmethoden
3. Verwenden Sie es so
quelle
table.Rows.Add(id);
führt bei Verwendung von SonarQube zu einem geringfügigen Codegeruch. Ich habe diese Alternative im foreach verwendet :var row = table.NewRow(); row["id"] = id; table.Rows.Add(row);
.Da gibt es eine Methode auf
Es ist möglicherweise bequemer, eine Methode zu erstellen, die einen zu ersetzenden Parameter (Namen) und eine Liste von Werten akzeptiert. Es befindet sich nicht auf der Parameterebene (wie AddWithValue ), sondern auf Befehl selbst. Es ist daher besser, es AddParametersWithValues und nicht nur AddWithValues zu nennen :
Abfrage:
Verwendung:
die Erweiterungsmethode:
quelle
Ich möchte einen anderen Weg vorschlagen, wie man die Einschränkung mit dem IN-Operator löst.
Zum Beispiel haben wir folgende Abfrage
Wir möchten mehrere IDs an Filterbenutzer übergeben. Leider ist es nicht einfach, mit C # umzugehen. Ich habe jedoch eine umfassende Problemumgehung, indem ich die Funktion "string_split" verwende. Wir müssen unsere Abfrage ein wenig umschreiben, um Folgendes zu tun.
Jetzt können wir leicht eine Parameteraufzählung von durch Komma getrennten Werten übergeben.
quelle
Das Übergeben eines Arrays von Elementen als reduzierter Parameter an die WHERE..IN-Klausel schlägt fehl, da die Abfrage die Form von hat
WHERE Age IN ("11, 13, 14, 16")
.Sie können Ihren Parameter jedoch als Array übergeben, das in XML oder JSON serialisiert ist:
Mit
nodes()
Methode:Mit
OPENXML
Methode:Das ist ein bisschen mehr auf der SQL-Seite und Sie benötigen ein richtiges XML (mit root).
Verwenden der
OPENJSON
Methode (SQL Server 2016+):Beachten Sie, dass für die letzte Methode die Kompatibilitätsstufe mindestens 130 sein muss.
quelle
Übersicht: Verwenden Sie den DbType, um den Parametertyp festzulegen.
quelle
Verwenden Sie
.AddWithValue()
also:sqlComm.Parameters.AddWithValue("@Age", sb.ToString().TrimEnd(','));
Alternativ können Sie Folgendes verwenden:
Ihr gesamtes Codebeispiel sieht dann wie folgt aus:
quelle
Hier ist eine kleine Variante von Brians Antwort, die jemand anderes nützlich finden könnte. Nimmt eine Liste von Schlüsseln und legt sie in der Parameterliste ab.
quelle
Versuchen
quelle
versuche es so
quelle