Übergabe von Array-Parametern an SqlCommand in C#
In C# kann es beim Versuch, Array-Parameter an einen SQL-Befehl zu übergeben, zu einem Problem kommen, das nicht wie erwartet funktioniert. Die Hauptursache liegt darin, dass Arrays nicht direkt als Parameter zu SqlCommand hinzugefügt werden können. Um dieses Problem zu lösen, muss jeder Wert im Array einzeln hinzugefügt werden.
Lösung:
Array-Parameter definieren:
Erstellen Sie ein Array von Parametern mit den erforderlichen Namen und Datentypen.
Parameter zu SqlCommand hinzufügen:
Fügen Sie für jeden Wert im Array ein neues SqlParameter-Objekt hinzu und geben Sie den entsprechenden Namen und Wert an. Legen Sie bei Bedarf den entsprechenden SqlDbType und die entsprechende Größe fest.
IN-Klausel ersetzen:
Ersetzen Sie den Platzhalter „{parameterNameRoot}“ in CommandText durch eine durch Kommas getrennte Liste von Parameternamen.
Beispiel:
<code class="language-csharp">var parameters = new string[items.Length]; // 此处items应替换为实际的数组变量 var cmd = new SqlCommand(); for (int i = 0; i < items.Length; i++) { cmd.Parameters.AddWithValue("@param" + i, items[i]); } cmd.CommandText = cmd.CommandText.Replace("{param}", string.Join(",", Enumerable.Range(0, items.Length).Select(i => "@param" + i)));</code>
Verbesserte Lösung:
Eine verbesserte, wiederverwendbare Lösung kann als Erweiterungsmethode implementiert werden:
<code class="language-csharp">public static class SqlCommandExt { public static SqlParameter[] AddArrayParameters<T>(this SqlCommand cmd, string paramNameRoot, IEnumerable<T> values, SqlDbType? dbType = null, int? size = null) { var parameters = new List<SqlParameter>(); var parameterNames = new List<string>(); var paramNbr = 1; foreach (var value in values) { var paramName = string.Format("@{0}{1}", paramNameRoot, paramNbr++); parameterNames.Add(paramName); var p = new SqlParameter(paramName, value); if (dbType.HasValue) p.SqlDbType = dbType.Value; if (size.HasValue) p.Size = size.Value; cmd.Parameters.Add(p); parameters.Add(p); } cmd.CommandText = cmd.CommandText.Replace("{" + paramNameRoot + "}", string.Join(",", parameterNames)); return parameters.ToArray(); } }</code>
Verwendung:
<code class="language-csharp">var cmd = new SqlCommand("SELECT * FROM TableA WHERE Age IN ({Age})"); cmd.AddArrayParameters("Age", new int[] { 1, 2, 3 });</code>
Dieses verbesserte Beispiel verwendet Generika, was es flexibler macht und die Angabe von SqlDbType und Size ermöglicht. Außerdem wird das potenzielle Sicherheitsrisiko vermieden, das durch das direkte Zusammenfügen von Parameternamen in CommandText entsteht. Denken Sie daran, bei der tatsächlichen Verwendung TableA
und Age
durch Ihre tatsächlichen Tabellen- und Spaltennamen zu ersetzen.
Das obige ist der detaillierte Inhalt vonWie übergeben Sie Array -Parameter an einen SQLCommand in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!