Rückgabewert von OleDbCommand
sqlQuery = "SELECT [ID] from [users] WHERE CallerName=@CallerName";
OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
cmd = new OleDbCommand(sqlQuery, conn);
cmd.CommandText = sqlQuery;
cmd.Parameters.Add("@CallerName", OleDbType.VarChar).Value = labelProblemDate.Text.Trim();
cmd.Parameters["@CallerName"].Value = name;
cmd.ExecuteNonQuery();
conn.Close();
Mir wurde gesagt, dass dies ist, wie das Lesen von Daten aus einer SELECT-Abfrage mit Parameter, aber es funktioniert nicht. Ich glaube, ich habe etwas falsch gemacht.
Ich bin mit WinForms und Microsoft Access 2007
- Welche Fehlermeldungen erhalten Sie? Auch, Sie scheinen zu verwechseln mit Ihrer
@CallerName
parameter. Was ist die variable "name" und auchExecuteNonQuery
nicht durchführen a wählen Sie. - Willst du alle ID ' s mit diesem Namen, oder nur eine? Wenn letzteres, wäre es besser zu
SELECT TOP 1 ID FROM [users] WHERE CallerName=@CallerName
. Dann verwenden SieExecuteScalar
(link inside), um nur die ausgewählte ID (falls vorhanden).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie Sie haben Ihre Antwort, aber ich wollte darauf hinweisen, ein paar Dinge aus deinem Beispiel-code:
Beachten Sie zunächst, dass Ihre SQL-Abfrage mithilfe von Microsoft SQL-syntax und das Microsoft Access-lieber eine etwas andere syntax. Statt der Verpackung Ihrer Spalte-Namen in eckigen Klammern, verwenden Sie das tilde-Zeichen:
Nächsten, in der SQL-Abfrage, beachten Sie, dass Microsoft Access nicht akzeptieren benannte Parameter. Dein SQL-text über die Verwendung
@CallerName
ausgeführt wird, kein problem, aber alle DB-Objekt sehen, ist dies:Wenn, irgendwann später, Sie entscheiden, zu gehen mit Gespeicherten Prozeduren anstelle von SQL-text, denken Sie daran, rufen Sie Prepare() auf Ihre
OleDbCommand
nachdem Sie die Parameter und vor der Ausführung des Befehls.Wenn Sie mehrere Parameter haben, sicherzustellen, dass Sie fügen Sie diese Parameter zu Ihrer
OleDbCommand
in der gleichen Reihenfolge, dass Sie Sie nannte in Ihrer SQL-text. OleDb ist es egal, was Sie nennen Sie, aber Sie können Sie für sich selbst, um Ihnen zu helfen; es ist NICHT in der Abfrage verwendet.@CallerName
machen keinen Versuch, zu entsprechen, mit nichts in Ihrem SQL-text.Als Nächstes wollte ich schauen, um Ihre Nutzung der
OleDbParameter
Element. In den folgenden zwei Zeilen, fügen Sie einen (1) parameter, um IhreOleDbCommand
mit dem Wert labelProblemDate.Text.Trim() und in der nächsten Zeile sind Sie erneut zuweisen, die gleiche parameter-Wert in eine variable (die uns unbekannt ist) genanntname
. Es tut nicht gut für Sie, deklarieren Sie den parameter mit einem Wert dann neu zuordnen es um etwas anderes.Könnten Sie verwendet haben, geändert snippet unten und bekommen die gleichen Ergebnisse (vergessen Sie nicht, fügen Sie die Größe Feld, wie unten gezeigt, angegeben und in Ihrer Datenbank):
Ähnlich, Ihr
OleDbCommand
erstellt wird mit IhrensqlQuery
parameter, so ist die Angabe Ihres BefehlsCommandText
Eigenschaft ist unnötig:Schließlich, wie schon andere gesagt haben, wenn Sie wollen, um die Daten abzufragen, wie Ihre SQL-Anweisung schlage vor, Sie müssen Lesen Sie die Daten im Gegensatz zum Aufruf
ExecuteNonQuery()
(Ankündigung heißt es Non-Abfrage).Um es zusammenzufassen, ich habe geschrieben es hier:
Immer wieder die Nähe in einer
finally
block, falls Ihr Programm wirft einen Fehler aus irgendeinem Grund. Dies verhindert, dass die Anwendung abstürzt und verlassen Sie die Datei öffnen. Einusing
Klausel, die ich gefunden habe, nicht unbedingt schließen eine Verbindung, wenn es fertig ist (wie Sie es tun sollen).Ich hoffe, das hilft. Ich frische gerade meine Kenntnisse
OleDb
im moment, und wollte darauf hinweisen, ein paar Dinge.ExecuteNonQuery nicht zurück Daten, nur die betroffenen Zeilen durch Ihren Befehl
Sie benötigen ExecuteReader mit OleDbDataReader
Wenn eine Abfrage, die einen Wert zurückgibt, können Sie
ExecuteScalar
um den Wert abzurufen.ExecuteNonQuery
nicht einen Wert zurückgeben, aus Ihrer Datenbank; es ist vielmehr bestimmt für die Verwendung mitUPDATE
Aussagen und dergleichen, und es gibt die Anzahl von Zeilen betroffen von der Anweisung.Sie kennen das wahrscheinlich, aber im Allgemeinen, WÄHLEN Sie Abfragen können mehr als eine Zeile zurückgegeben (und mehr als eine Spalte), also zum "Lesen von Daten aus einer SELECT-Abfrage" verwenden Sie
ExecuteReader
zu bekommenDbDataReader
.Daten zu Lesen und Laden Sie es in DataTable:
Lesen Scalor Wert Daten, und Laden Sie es in eine Variable:
Ich hoffe, es hilft