2017-06-28 7 views
0

Ich versuche, Code aus zwei Tabellen in Access-Datenbank-Datei zu löschen. Manchmal wird einer von ihnen arbeiten und der andere wird es nicht tun, wenn ich es auf eine andere Weise versuche, wird es das Gegenteil bewirken. Also am Ende nur 1 der 2 funktioniert.So löschen Sie aus Access-Datenbank von C#

Hier ist mein Code Ich hoffe, jemand kann etwas, das ich falsch gemacht habe, erkennen.

try 
{ 
    Conn.Open(); 
    OleDbCommand command = new OleDbCommand(); 
    command.Connection = Conn; 
    command.CommandText = "DELETE FROM TBLNAME WHERE name [email protected]"; 
    command.Parameters.AddWithValue("@name", lvlist.SelectedItems[0].Text); 
    command.ExecuteNonQuery(); 

    command.CommandText = "DELETE from TBLNAME WHERE cb_listName [email protected]"; 
    command.Parameters.AddWithValue("@listname", lvlist.SelectedItems[0].Text); 
    command.ExecuteNonQuery(); 
    Conn.Close(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Error " + ex); 
} 
+1

Sie müssen die Parameter nicht vor dem Ausführen des nächsten Befehls löschen? Verwenden von "command.Parameters.Clear();" –

+0

Am besten erstellen Sie eine zweite, frische 'OleDbCommand'-Instanz. – knittl

+0

Ich weiß nicht, ob dies eine gute Übung ist, aber Sie scheinen für jede Anweisung den gleichen Wert zu verwenden. Sie könnten also den Parameter in der zweiten delete-Anweisung auf @name ändern und den zweiten Parameter.AddwithValue für jeden Befehl entfernen Text verwendet den gleichen Parameter und den gleichen Wert für die zwei verschiedenen Kommandotext –

Antwort

3

Sie sollten verschiedene Befehlsinstanzen verwenden, eine für jeden Befehl, den Sie ausführen möchten. Wenn Sie das nicht tun, müssen Sie die Parameter löschen. Dies liegt daran, dass Parameter in OleDb-Abfragen positionsbezogen und nicht benannt sind. Das heißt, wenn Sie den zweiten Parameter in der zweiten Abfrage hinzufügen, wird der erste Parameter verwendet, weil er der erste in der Liste ist.

using(var connection = new OleDbConnection("connection string here")) 
{ 
    connection.Open(); 
    using(var command = new OleDbCommand("DELETE FROM TBLNAME WHERE name = @name", connection)) 
    { 
     cmd.Parameters.Add(new OleDbParameter("@name", OleDbType.VarChar, 50)).Value = lvlist.SelectedItems[0].Text; 
     command.ExecuteNonQuery(); 
    } 

    using(var command = new OleDbCommand("DELETE from TBLNAME WHERE cb_listName = @listname", connection)) 
    { 
     cmd.Parameters.Add(new OleDbParameter("@listname", OleDbType.VarChar, 50)).Value = lvlist.SelectedItems[0].Text; 
     command.ExecuteNonQuery(); 
    } 
} 

Auch sollten Sie:

  1. Verwenden using Blöcke, um sicherzustellen, Verbindungen nach Gebrauch geschlossen sind. Versuchen Sie nicht, Klassenbereichsverbindungen oder noch schlimmer globale Verbindungsinstanzen zu erstellen.
  2. Sie sollten auch den DB-Typ für Ihre Parameter angeben und nicht AddwithValue verwenden.
  3. Wenn möglich, geben Sie auch die Länge für Ihre DB-Typen an, im obigen Fall ist dies möglich, wenn Sie einen Varchar-Typ haben. note Toke ich eine Vermutung an Ihrem Schema Länge für diese Spalten

schließlich nur eine Notiz über die allgemeine Best Practices, fügen Sie nicht catch Blöcke, die nichts Nützliches mit Ausnahme machen. Protokollieren Sie mindestens den Typ, die Nachricht und die Stack-Ablaufverfolgung, und wiederholen Sie dann das rekursiv für jede innere Ausnahme, die in Eigenschaft InnerException gefunden wird. Anhand dieser nützlichen Informationen können Sie genau herausfinden, warum eine Ausnahme aufgetreten ist.

+0

Danke. um zu helfen, versuche ich es jetzt. Ich habe die Verbindungszeichenfolge am Anfang der Form vordefiniert, also sollte ich es jedes Mal definieren? oder ist das ok? –

+0

Ich erhalte eine Fehlermeldung, dass eine verfügbare und offene Verbindung vorhanden sein muss und dass der Status geschlossen ist. –

+0

@Don - Wenn Sie den Code schauen, den ich zur Verfügung stellte, erstellt die 1. Linie die Verbindung und die 2. Linie öffnet sie. Diese Verbindungsinstanz wird dann an den Konstruktor jeder 'OleDbCommand'-Instanz übergeben. – Igor

1

Verwenden Sie zwei verschiedene OleDbCommand-Objekte.