2016-06-28 6 views
0

Ich versuche, eine Access-Datenbank über meine C# -Webanwendung zu aktualisieren, aber ich bin derzeit ein Problem in WHERE-Anweisung nicht die Datensätze aktualisieren und keine Fehler zurück.C# OleDB Update-Anweisung nicht aktualisieren

Ich versuche ein Textfeld zu aktualisieren und die Bedingung in meiner WHERE-Anweisung ist eine ganze Zahl.

 OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = @Title WHERE ID = @ID"); 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 
     cmd.Parameters.AddWithValue("@Title", TextBox1.Text); 
     cmd.Parameters.AddWithValue("@ID", param2); 

ich sogar versucht, es zu tun auf diese Weise

 OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = ? WHERE ID = ?"); 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 
     cmd.Parameters.AddWithValue("?", TextBox1.Text); 
     cmd.Parameters.AddWithValue("?", param2); 

Aber es ist die Aktualisierung noch nicht!
Was ich herausgefunden habe, als ich versuchte, es zu reparieren, ist, dass, wenn ich den ersten Parameter durch eine Zeichenkette zwischen einfachen Anführungszeichen (siehe unten) ersetze, die Tabelle tatsächlich aktualisiert.

OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = 'test' WHERE ID = @ID"); 

Hat einer von euch eine Idee, warum passiert das?

Edit: Dies ist der vollständige Code

using (OleDbConnection conn = new OleDbConnection(connectionString)) 
    { 
     OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = @Title WHERE ID = @ID"); 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 
     cmd.Parameters.AddWithValue("@Title", TextBox1.Text); 
     cmd.Parameters.AddWithValue("@ID", param2); 
     conn.Open(); 
     try 
     { 
      cmd.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.Message); 

     } 

Edit 2:
Dies ist mein Code nach dem Versuch, die Datentypen zu setzen, ist es immer noch nicht funktioniert.
Um in meiner Access-Datenbank-ID zu klären ist „Autowert“ und Titel ist „Langtext“

using (OleDbConnection conn = new OleDbConnection(connectionString)) 
    { 
     OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = ? WHERE ID = ?"); 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 
     cmd.Parameters.AddWithValue("Title", TextBox1.Text).OleDbType = OleDbType.VarChar; 
     cmd.Parameters.AddWithValue("ID", param2).OleDbType = OleDbType.Integer; 
     conn.Open(); 
     try 
     { 
      var recordsUpdated = cmd.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.Message); 
     } 

Wenn ich den Wert von recordsUpdated überprüfen, es gibt „1“, aber die Datenbank wird nicht aktualisiert werden.

+0

Sind Sie in einer Transaktion, die rückgängig gemacht wird? – yaakov

Antwort

1

Sie müssen ExecuteNonquery aufrufen, die die Anweisung ausführt.

// your OleDbConnection should also be wrapped in a using statement to ensure it is closed 
using (OleDbConnection conn = new OleDbConnection(connectionString)) 
{ 
    conn.Open(); // open the connection 
    using(OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = ? WHERE ID = ?")) // wrap in using block because OleDbCommand implements IDisposable 
    { 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 
     cmd.Parameters.AddWithValue("Title", TextBox1.Text).OleDbType = OleDbType.VarChar; // Title, also set the parameter type 
     cmd.Parameters.AddWithValue("ID", param2).OleDbType = OleDbType.Integer; // ID, I am guessing its an integer but you should replace it with the correct OleDbType 
     var recordsUpdated = cmd.ExecuteNonQuery(); // execute the query 

     // recordsUpdated contains the number of records that were affected 
    } 
} 
  • Die Reihenfolge op die Parameter, die Sie hinzufügen, muss die Reihenfolge der Parameter in der SQL-Anweisung übereinstimmen.
  • Achten Sie darauf, dass Sie für jeden Parameter OleDbType angeben, damit der Befehl nicht raten muss, was er ist. Ich vermute, Titel ist ein varchar und ID ist integer, korrigieren Sie dies, wenn es eine falsche Annahme ist.
  • Sie können "?" mit Parameternamen, um das Hinzufügen von Parametern leichter lesbar zu machen und das? Platzhalter in der Update-Anweisung. Microsoft tut dies in vielen ihrer Beispiele in ihrer Dokumentation
  • ExecuteNonQuery gibt die Anzahl der betroffenen Zeilen, um das Ergebnis zu erfassen und sie für das Debuggen verwendet werden (siehe Code-Update)

Als ich das überprüfen Wert von recordsUpdated, es gibt "1" zurück aber die Datenbank wird nicht aktualisiert.

Wenn 1 zurückgegeben wird, wird 1 Datensatz aktualisiert. Hier sind 2 Tipps zur Fehlersuche.

  • Sie sollten sicherstellen, dass Ihre Abfrage denselben Datensatz aktualisiert, den Sie überprüfen. Erfassen Sie während des Debuggens den Wert param2, und verwenden Sie diesen manuell in einer SELECT-Anweisung in Access, um die Titelspalte dieses Datensatzes SELECT Title FROM Data WHERE ID = [id here] anzuzeigen.Holen Sie auch den Wert TextBox1.Text in Debugging und überprüfen Sie diesen Wert gegen was von der manuell ausgeführte select Abfrage zurückgegeben wird.
  • Da dies Ms Access ist und die Datei sich auf dem Datenträger befindet, stellen Sie sicher, dass Sie manuell in derselben Datenbank suchen, mit der Sie sich in Ihrer Verbindungszeichenfolge verbinden. Wenn Sie zwei Kopien der Datenbank haben, könnte dies leicht zu der falschen Schlussfolgerung führen, dass ein Update nicht durchgeführt wird.
+0

Wenn dies das Problem nicht löst, geben Sie die Verbindungszeichenfolge ein. Wenn die Datenbank nicht aktualisiert wird, verweisen Sie normalerweise auf die falsche Datenbank. – jdweng

+0

Ich habe den Hauptpost mit meinem vollständigen Code bearbeitet. Die Verbindungszeichenfolge referenziert die richtige Datenbank, weil, wie ich in dem Beitrag sagte, aktualisiert die Tabelle, wenn ich den String-Parameter loswerden. – mejaw

+0

@mejaw - Ich habe die Antwort aktualisiert – Igor