Frage 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 man so Daten aus einer SELECT-Abfrage mit Parametern lesen kann, aber es funktioniert nicht. Ich glaube, ich habe etwas falsch gemacht.

Ich verwende WinForms und Microsoft Access 2007


5
2018-04-27 16:34


Ursprung


Antworten:


Es sieht so aus als hättest du deine Antwort, aber ich wollte ein paar Dinge aus deinem Beispielcode hervorheben:

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();

Beachten Sie, dass Ihre SQL-Abfrage Microsoft SQL-Syntax verwendet und dass Microsoft Access eine etwas andere Syntax bevorzugt. Anstatt die Spaltennamen in eckige Klammern zu schreiben, verwenden Sie die Tilde:

sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=@CallerName";

Beachten Sie als Nächstes in Ihrer SQL-Abfrage, dass Microsoft Access keine benannten Parameter akzeptiert. Ihr SQL-Text oben mit @CallerName wird ohne Probleme ausgeführt, aber das OleDb-Objekt wird folgendes sehen:

sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=?";

Wenn Sie sich später dafür entscheiden, mit Stored Procedures anstelle von Text SQL zu arbeiten, denken Sie daran, anzurufen Bereiten() auf Ihrem OleDbCommand nach dem Hinzufügen Ihrer Parameter und vor dem Ausführen des Befehls.

Wenn Sie mehrere Parameter haben, stellen Sie sicher, dass Sie diese Parameter zu Ihrem hinzufügen OleDbCommand in der Reihenfolge, in der Sie sie in Ihrem SQL-Text aufgerufen haben. OleDb ist es egal, wie Sie sie benennen, aber Sie können sie für sich selbst verwenden, um Ihnen zu helfen; Es wird NICHT in der Abfrage verwendet. @CallerName wird keinen Versuch unternehmen, mit irgendetwas in Ihrem SQL-Text übereinzustimmen.

Als nächstes wollte ich auf Ihre Verwendung der suchen OleDbParameter Artikel. In den folgenden zwei Zeilen fügen Sie einen (1) Parameter zu Ihrem hinzu OleDbCommand mit dem Wert labelProblemDate.Text.Trim () und in der nächsten Zeile bist du neu zuweisen Der gleiche Parameterwert wird für eine Variable (die uns unbekannt ist) aufgerufen name. Es ist nicht gut für Sie, den Parameter mit einem Wert zu deklarieren und ihn dann etwas anderem zuzuweisen.

Sie hätten das unten aufgeführte modifizierte Snippet verwenden und dieselben Ergebnisse erhalten können (denken Sie daran, das Größenfeld wie unten gezeigt hinzuzufügen und in Ihrer Datenbank anzugeben):

cmd.Parameters.Add("@CallerName", OleDbType.VarChar, 255).Value = labelProblemDate.Text.Trim();
// cmd.Parameters["@CallerName"].Value = name;

Ähnlich, dein OleDbCommand wird mit deinem erstellt sqlQuery Parameter, so dass Sie Ihren Befehl angeben CommandText Eigentum ist nicht notwendig:

cmd = new OleDbCommand(sqlQuery, conn);
//cmd.CommandText = sqlQuery;

Schließlich, wie andere gesagt haben, wenn Sie Ihre Daten abfragen möchten, wie Ihre SQL-Anweisung vorschlägt, müssen Sie die Daten im Gegensatz zu dem Aufruf lesen ExecuteNonQuery() (Beachten Sie, dass es heißt Nicht Abfrage).

Um es zusammenzufassen, ich habe es hier geschrieben:

sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=?";
int result = 0;
OleDbConnection conn = new OleDbConnection(connectionString);
try {
  conn.Open();
  var cmd = new OleDbCommand(sqlQuery, conn);
  //cmd.CommandText = sqlQuery; This command was specified by your initializer
  cmd.Parameters.Add("?", OleDbType.VarChar, 255).Value = labelProblemDate.Text.Trim();
  //cmd.Parameters["@CallerName"].Value = name; Possible bug here
  using (OleDbDataReader reader = cmd.ExecuteReader())
  {
    if(reader.HasRows)
    {
      reader.Read();
      result = reader.GetInt32(0);
    }
  }
} finally {
  conn.Close();
}
return result;

Stellen Sie immer das Schließen in a finally blockieren, falls Ihr Programm aus irgendeinem Grund einen Fehler ausgibt. Dies verhindert, dass Ihre Anwendung abstürzt und die Datei geöffnet bleibt. EIN using Klausel, ich habe gefunden, schließt nicht unbedingt eine Verbindung, wenn es getan wird (wie sie es tun sollen).

Ich hoffe das hilft. Ich bereite mein Wissen über OleDb im Moment, und wollte ein paar Dinge aufzeigen.


7
2018-05-16 15:27



ExecuteNonQuery gibt keine Daten zurück, sondern nur die Zeilen, die von Ihrem Befehl betroffen sind
Sie müssen ExecuteReader mit einem OleDbDataReader verwenden

OleDbDataReader reader = cmd.ExecuteReader();           
if(reader.HasRows)
{
    reader.Read();
    var result = reader.GetInt32(0);
}

6
2018-04-27 16:37



Wenn eine Abfrage einen Wert zurückgibt, können Sie verwenden ExecuteScalar um den Wert abzurufen. ExecuteNonQuery gibt keinen Wert aus Ihrer Datenbank zurück; Es ist eher für den Einsatz gedacht UPDATEAnweisungen und dergleichen und gibt die Anzahl der Zeilen zurück, die von der Anweisung betroffen sind.

Sie wissen das wahrscheinlich, aber im Allgemeinen können SELECT-Abfragen mehr als eine Zeile (und mehr als eine Spalte) zurückgeben, also "Daten von einer SELECT-Abfrage lesen", die Sie verwenden ExecuteReader einen bekommen DbDataReader.


2
2018-04-27 16:36



So lesen Sie Daten und laden sie in DataTable:

OleDataReader rdr = (OleDataReader) cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(rdr);

Scalor-Wertdaten lesen und in Variable laden:

int result = (int)cmd.ExecuteScalar(); //Assume scalar value to be return is int

Ich hoffe, es hilft


1
2018-04-27 16:48