2017-02-16 5 views
0

Ich habe eine OleDB-Verbindung in meiner Webanwendung, die mit der MS Access-Datenbank mit ein paar Suchparametern (OrderID, LineNumber) als Eingabe verknüpft ist. Das hat in den letzten Jahren gut funktioniert.OleDbcommand: Wie benutzt man 'In' - Klausel mit Parametern?

Jetzt wurde ich aufgefordert, die Suche nach mehreren LineNumbers (z. B. 2,3,8) zu ermöglichen. Wenn ich die hard funktioniert es natürlich:

and ([Position] in ('2','3','8') or @LINENUM ='') 

Wie kann ich diese dynamisch mit dem angegebenen Eingabeformat als kommagetrennte Zeichenfolge erreichen?

Ich habe versucht, eine Zeichenfolge mit der LineNumbers außerhalb der OleDBcommand Zeichenfolge mit C# und dann übergeben Sie den Parameter, aber es wird nicht funktionieren.

and ([Position] in @LineNumbers or @LINENUM ='') 

ich mit dem LineNumbers innerhalb der OleDbCommand einen Tisch zu bauen, wurde auch versucht, wie:

DECLARE @LineNumber TABLE (Value INT) 
INSERT INTO @LineNumber VALUES (2) 
INSERT INTO @LineNumber VALUES (3) 
INSERT INTO @LineNumber VALUES (8) 

and ([Position] IN (SELECT Value FROM @LineNumber)) 

aber dann der Fehler

„Ungültige SQL-Anweisung, erwartet 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT' oder 'UPDATE' "

wurde t hoch

Wie kann ich das tun?


Dies ist, was mein Code wie folgt aussieht:

string SelectOleDb = @"SELECT SalesID, CertificationID, CalibrationDate, Path 
         FROM Zeugnis WHERE (SalesID = @SALESID or @SALESID = '') 
           and ([Position] = @LINENUM or @LINENUM ='') 

         UNION ALL 

         SELECT SalesID, CertificationID, CalibrationDate, Path 
         FROM Zeugnis_2016 WHERE (SalesID = @SALESID or @SALESID = '') 
           and ([Position] = @LINENUM or @LINENUM ='') 

         UNION ALL 

         SELECT SalesID, CertificationID, CalibrationDate, Path 
         FROM Zeugnis_2015 WHERE (SalesID = @SALESID or @SALESID = '') 
           and ([Position] = @LINENUM or @LINENUM ='') 
         ORDER BY CalibrationDate, CertificationID"; 

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\XXXXXXXX"); 
OleDbCommand cmd = new OleDbCommand(); 
OleDbDataAdapter da = new OleDbDataAdapter(); 
cmd = new OleDbCommand(SelectOleDb, con); 
cmd.CommandType = CommandType.Text; 
cmd.Parameters.AddWithValue("SALESID", SALESID.Text); 
cmd.Parameters.AddWithValue("LINENUM", LINENUM.Text); 

Antwort

1

Ich denke, diese Zeile ändern müssen:

and ([Position] in @LineNumbers or @LINENUM ='') 
wie dies in C#

etwas:

string LineNumber = "('2','3','8')"; // build this string dynamically 

string sqlCondition = " and ([Position] in " + LineNumbers + " or @LINENUM ='')"; 

dann verketten Sie die sqlCondition String zu Ihrem Haupt SELECT String.

Wenn Sie das vollständige Beispiel möchten, dann posten Sie Ihr komplettes Code-Snippet, das die SQL-Abfrage über OleDB ausführt.

+0

[Position] ist eine Spalte in der Select-Zeichenfolge und kann daher nicht statisch in der sqlCondition-Zeichenfolge verwendet werden. Oder schlagen Sie vor, die Abfrage dynamisch zu erstellen und dann auszuführen? Ich denke, das wird mit OdeDb nicht funktionieren. – Barnabeck

+0

@Barnabeck Ja, ich schlage vor, dass Sie diese 'string SelectOleDb' Zeichenfolge dynamisch erstellen und NICHT diesen Parameter' cmd.Parameters.AddWithValue ("LINENUM", LINENUM.Text) verwenden; 'um eine Liste von möglichen Werten für die' IN' Klausel zu übergeben . – andrews

+0

Jetzt habe ich es! Vielen Dank. Ich war verwirrt, weil ich dachte, dass dein Hinweis auf DynamicSQL zeigt. – Barnabeck