MS Access-Fehler: Die SELECT-Anweisung schließt ein reserviertes Wort oder einen Argumentnamen, dass ist falsch geschrieben oder fehlt, oder die Zeichensetzung falsch ist
[Update: Die Abfrage funktioniert, wenn ich fest in die Parameter - also es hat zu tun mit der Art, wie ich bin, hinzufügen von Parametern für die Abfrage]
Für das Leben von mir, ich kann nicht herausfinden, was das problem hier ist.
Hier ist die Abfrage übergeben wird, um das datareader-Objekt:
SELECT * FROM (SELECT TOP ? StartDate, [ID] FROM
(SELECT TOP ? StartDate, [ID] FROM Story
ORDER BY StartDate DESC, [ID] DESC) AS foo
ORDER BY StartDate ASC, [ID] ASC) AS bar
INNER JOIN Story AS t ON bar.ID = t.ID
ORDER BY bar.StartDate DESC, bar.[ID] DESC
Die Parameter in der folgenden Reihenfolge:
var pNumToRetrieve = new OleDbParameter("", OleDbType.Integer) {Value = numToGet};
var pResultSet = new OleDbParameter("", OleDbType.Integer) {Value = resultSet};
_cmd.Parameters.Add(pNumToRetrieve);
_cmd.Parameters.Add(pResultSet);
Wenn ich geben Sie diese Abfrage in access direkt funktioniert es Prima. Aber bei der Ausführung der Abfrage aus ASP.NET, bekomme ich die folgende Fehlermeldung:
Die SELECT-Anweisung schließt ein reserviertes Wort oder einen Argumentnamen, dass ist falsch geschrieben oder fehlt, oder die Zeichensetzung falsch ist.
Was mache ich falsch?
Dank,
Adam
- Das problem ist mit der Ausführung des string in ASP.NET. Also die benötigten Tags und Fähigkeiten anzuwenden wäre ASP.NET. ???
- Könnten Sie das näher? Die Abfrage, die ich eingefügt oben ist entnommen aus dem debugger asp.net - dies ist der exakte Wert/string wird übergeben.
- Ich glaube Sie meinten, dass Ihre Frage hätte tagged ASP.NET nicht SQL. Aber von Ihr akzeptiert die Antwort es scheint, ist dies nicht wahr.
- Ah, ich sehe. Ich änderte den tag. Danke -- Adam
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den N in TOP-N-Abfragen in Jet-SQL kann nicht parametriert werden, Punkt. Schreiben Sie Ihre SQL-string-on-the-fly eine variable N. Das bedeutet entweder, dass Sie nicht verwenden können, eine QueryDef gespeichert, oder Sie haben zu Bearbeiten Sie das SQL des QueryDef-Objekts und speichern Sie es, bevor Sie es.
Betrachten umschreiben Sie
TOP N
Konstrukte mithilfe einer korrelierten Unterabfragen.Hier ist ein einfaches Beispiel. Betrachten Sie eine Tabelle namens-Sequenz mit einer Spalte (seq) einzigartige
INTEGER
s (standard-SQL-Hilfs-Tabelle, die in unzähligen Situationen nützlich -- jede Datenbank sollte eine haben!)Beiden folgenden Abfragen zurückgeben von zwei die höchsten Werte für seq:
1)
Vorteile: Die Access-Datenbank-engine führt diese relativ gut (wie man es erwarten würde für proprietäre syntax).
Nachteile: Proprietäre syntax, daher schlecht für die Portabilität. Die N (wie bei TOP N) kann nicht eingestellt. Für mich, mit
DESC
imORDER BY
zurück, die höchsten Werte ist "Kontra-intuitiv".2)
Vorteile: Standard-SQL-syntax, daher gut für unterwegs. Die N parametrisiert werden kann.
Nachteile: Die Access-Datenbank-engine nicht optimieren korrelierte Unterabfragen auch deshalb wird die Leistung verschlechtern, da die Anzahl der Zeilen in der Tabelle erhöht (wie immer mit performance-Probleme, werden Sie brauchen, um es zu testen). Einige SQL-Programmierer finden, die eine korrelierte Unterabfrage schwer zu verstehen und hat daher mögliche Probleme bei der Wartung.
Ist es, dass die pResultSet parameter eingegeben wird, wie OleDbTypeInteger?
Mag er die Reihenfolge durch, in der Unterabfragen? Das ist nicht unterstützt SqlServer.
Edit : Mein Fehler, ich verpasste die Top ?
Sehen, wenn Sie ändern Sie die Abfrage, um auf diese Weise hilft.
EDIT: Auf einer Seite Hinweis, was ist es Wert, weitergegeben werden, mit denen 2 Parameter? Sind beide zahlen?
Ich feststellen, dass nicht alle ID-Spalten haben Klammern um Sie herum. Dies könnte es sein aber es ist schon eine Weile her, seit ich gespielt habe mit Access, so dass jemand anderes möglicherweise eine bessere Antwort.
EDIT:
Als Sie ' ve hatte kein Glück, so weit werde ich versuchen eine andere Vermutung. Könnten Sie versuchen, ändern Sie die "*" stattdessen explizit die Namen der Spalten, die Sie wollen.
LETZTE ÄNDERUNG:
Das Letzte Stück der Rat, den ich zu bieten haben ist, ersetzen Sie die Abfrage mit einer sehr einfachen version von sich selbst, das bringt keine Ergebnisse. Dann probieren Sie es, wenn es fehlschlägt, es muss der parameter code, der fehlschlägt, wenn nicht, dann es ist etwas, was in der Komplexität der Abfrage. Wenn Sie nach und nach rekonstruieren die Abfrage sollte dann in der Lage sein zu erkennen, das scheitern Punkt. Sorry, ich kann nicht mehr helfen, aber.