2017-11-19 3 views
1

Ich verwende Visual Studio 2013, C# und SQL Server-Datenbank.Falsche Syntax in der Nähe von Parameter

Der T-SQL-Befehl funktioniert gut, wenn ich den Parameter durch einen konkreten Wert ersetzen.

ich diesen Fehler in der letzten Zeile des Codes:

falsche Syntax nahe '@ Collection1'.

Mein Code:

string myCommandString = "select Name, Collection, Text from List_Card @Collection1"; 
SqlConnection myConnection = new SqlConnection(connectionstring); 

SqlCommand myCommand = new SqlCommand(myCommandString, myConnection); 
SqlDataAdapter myydata = new SqlDataAdapter(); 

if (comboBox1.Text != "") 
{ 
    string1 = "where Collection IN (select Shortcut from Collections where Collection Like '" + comboBox1.Text + "')"; 
} 
else 
{ 
    string1 = ""; 
} 

myCommand.Parameters.Add(new SqlParameter("@Collection1", string1)); 
myydata.SelectCommand = myCommand; 

myConnection.Open(); 
DataTable myytab = new DataTable(); 
myydata.Fill(myytab); 
+2

Dies ist definitiv eine ungültige Syntax 'String myCommandString = "wählen Name, Sammlung, Text von List_Card @ Collection1",' was beabsichtigen Sie zu erreichen putting '@ Collection1' nach dem Tabellennamen? –

+2

T-SQL ist keine Datenbank-Engine – Plutonix

+0

i 'wo' Klausel in @collection haben.Wenn der Benutzer etwas in der ComboBox auswählt, brauche ich die where-Klausel. Wenn der Benutzer in der ComboBox nichts auswählt, brauche ich die where-Klausel nicht. – Matthew

Antwort

3

Es gibt mehrere Fehler in Ihrem Code.

Zuerst Ihr myCommandString:

"select Name, Collection, Text from List_Card @Collection1" 

, die ungültige SQL-Syntax ist (was der Fehler ist bist du immer). Du machst nichts mit dem Parameter. Sie müssen es als Teil einer WHERE-Klausel einfügen, aber Sie verwenden diesen Wert nicht.

Als nächstes verwenden Sie die SqlParameter völlig falsch. Schauen Sie sich the documentation zu sehen, wie richtig es zu benutzen. Das spezifische Problem besteht darin, dass Sie keine bedingte SQL-Zeichenfolge als zweiten Parameter zuweisen. Sie müssen bedingt, dass auf Ihre Anfrage anhängen.

Schließlich sollten Sie auch alles in using Aussagen wickeln, um richtig von den Objekten zu entsorgen.

Dies sollte Sie geben, was Sie suchen:

var myCommandString = "select Name, Collection, Text from List_Card "; 

if (comboBox1.Text != "") 
{ 
    myCommandString += " where Collection IN (select Shortcut from Collections where Collection Like '@Collection1')"; 
} 

using (var myConnection = new SqlConnection(connectionstring)) 
using (var myCommand = new SqlCommand(myCommandString, myConnection)) 
{ 
    myCommand.Parameters.Add(new SqlParameter("@Collection1", string1)); 

    using (var myData = new SqlDataAdapter()) 
    { 
     myData.SelectCommand = myCommand; 
     myConnection.Open(); 

     var myytab = new DataTable(); 
     myydata.Fill(myytab); 
    } 
} 
0

Sie geben nicht die ganze WHERE Klausel durch einen Parameter. Parameter sind anstelle von ... nun, Parametern erlaubt. Wenn Sie die WHERE Klausel auf der Grundlage einer Bedingung hinzufügen möchten in Ihrem C# -Code, dies zu tun:

string myCommandString = "SELECT Name, Collection, Text FROM List_Card"; 
. 
. 
. 

if (comboBox1.Text != "") 
{ 
    myCommandString += " WHERE Collection IN (SELECT Shortcut FROM Collections WHERE Collection Like '" + comboBox1.Text + "')"; 
} 

Außerdem ist es super wichtig ist zu dispose eines Objekts nach seiner Nutzung. Der schnellste Weg, dies zu tun, ist, den Code in einer using Anweisung zu schließen. Schließlich sollten Sie Ihr Bestes tun, um SQL injection attacks zu verhindern. Damit sind Sie bereits auf dem richtigen Weg - im Fall von ADO.NET ist das Hinzufügen von Parameter s zu Ihren dynamischen SQL-Abfragen der richtige Ansatz.

Seit SqlConnection, SqlCommand und SqlDataAdapter sind alle IDisposable Code-Objekte sollte wie folgt aussehen:

string myCommandString = "SELECT Name, Collection, Text FROM List_Card"; 

using (var myConnection = new SqlConnection(connectionstring)) 
using (var myCommand = new SqlCommand(myCommandString, myConnection)) 
using (var myydata = new SqlDataAdapter()) 
{ 
    if (comboBox1.Text != "") 
    { 
     myCommandString += " WHERE Collection IN (SELECT Shortcut FROM Collections WHERE Collection Like @Collection1)"; 
     myCommand.Parameters.Add(new SqlParameter("@Collection1", comboBox1.Text)); 
    } 

    myydata.SelectCommand = myCommand; 
    myConnection.Open(); 
    DataTable myytab = new DataTable(); 
    myydata.Fill(myytab); 
} 
+2

Dies ist String-Verkettung, anfällig für SQL-Injektion. Bitte ermutigen Sie nicht unsichere und schlechte Art, Fragen zu stellen. – Nino

+0

Das hat das OP schon. Die Zusammensetzung der SQL-Anweisung ist kein Thema dieses Posts, oder? –

+0

Bozhidar Stoyneff, ja das hat auch funktioniert, danke. – Matthew

1

Parameter nicht wie das funktionieren. Ich vermute, Sie wollen dieselbe Abfrage haben und dann dynamisch where-Klausel hinzufügen, wenn der Benutzer etwas auswählt. Leider können Sie es nicht so machen, dass die gesamte where-Klausel ein Parameter ist. Sie können versuchen, etwas wie folgt:

string myCommandString = @"select Name, Collection, Text from 
List_Card where Collection IN 
    (select Shortcut from Collections where Collection Like '%' + @collection + '%')"; 
SqlConnection myConnection = new SqlConnection(connectionstring); 
SqlCommand myCommand = new SqlCommand(myCommandString, myConnection); 
SqlDataAdapter myydata = new SqlDataAdapter(); 
myCommand.Parameters.Add(new SqlParameter("@Collection1", comboBox1.Text)); 
myydata.SelectCommand = myCommand; 
myConnection.Open(); 
DataTable myytab = new DataTable(); 
myydata.Fill(myytab); 
+0

Das Überspringen der Entsorgung von IDisposable-Objekten führt zu einer instabilen Anwendung, also ermutigen Sie sie bitte nicht. –

Verwandte Themen