2017-07-09 2 views
0

Meine Aufgabe sollte ganz einfach sein, aber nach Stunden und Stunden muss ich zugeben, ich bin völlig fest!C#: Zeile in DataTable löschen gilt nicht für Datenbank

Ich möchte einfach eine datarow aus einer datatable löschen. Meine Datentabelle ist eine Kopie der Tabelle in meinem aktuellen Datensatz in einer SQLite-Datenbank. Es ist zwingend notwendig, die table.row.Delete() Methode zu verwenden. Ich bin mir bewusst, dass delete() nur die Zeile markiert, die bei der Tabellenaktualisierung gelöscht werden soll.

Unten finden Sie den Code ich zur Zeit mit:

ich meine Daten über abrufen:

public DataTable GetTable(string tableName) 
    { 
     string connectionPath = dbVariables.ConnectionString; 

     try 
     { 

      SQLiteConnection myConnection = new SQLiteConnection(connectionPath); 

      myConnection.Open(); 
      string cmdStr = "SELECT * FROM " + tableName; 

      DataTable myTable = new DataTable(); 
      SQLiteDataAdapter myAdapter = new SQLiteDataAdapter(cmdStr, myConnection); 

      myAdapter.FillSchema(myTable, SchemaType.Source); 

      myTable.Columns[dbVariables.ClassesID].AutoIncrement = true; 
      myTable.Columns[dbVariables.ClassesID].AutoIncrementSeed = 1; 
      myTable.Columns[dbVariables.ClassesID].AutoIncrementStep = 1; 

      myAdapter.Fill(myTable); 

      myConnection.Close(); 

      return myTable; 

     } 
     catch (SQLiteException e) 
     { 
      MessageBox.Show(e.ToString()); 
      return null; 
     } 
    } 

Hier manipulieren ich meine Daten:

if (myResult == DialogResult.Yes) 
{ 
    //killTable.AcceptChanges(); 
    DataRow[] dr = killTable.Select("" + cmVariables.ClassName + " = '" + cmbClasses.Text + "'"); 

    //First I need to evaluate the row index of the row I want to delete 
    string indexName = (killTable.Rows.IndexOf(dr[0])).ToString(); 
    int i = Int32.Parse(indexName); 

    // And we are done - I got my row index 
    DataRow modifiedRow = killTable.Rows[i]; 

    killTable.Rows[i].Delete(); 

    //I inserted this messagebox just to see the rowstatus - and yes, it is marked as deleted on runtime... 
    MessageBox.Show(killTable.Rows[i].RowState); 

    // I refer to this in the text below 
    killTable.AcceptChanges(); 

    killClass_Execution(killTable, cmbClasses.Text, ShortClassNm); 
} 

Und zumindest den Code aktualisiere meine Datentabelle zurück in die Datenbank:

public void UpdateTable(string tableName, DataTable sourceTable, bool newOrEdit) 
    {   
     try 
     { 
      string connectionPath = dbVariables.ConnectionString; 
      //Connection erstellen --> der connectString gibt dabei den Pfad an. 
      SQLiteConnection myConnection = new SQLiteConnection(connectionPath); 

      myConnection.Open(); 

      //Einen Befehls-String erstellen, der das UPDATE-Command auslöst 
      // UPDATE cm_ClassTest SET className = userEditInput WHERE className = 'oldClassName' 
      string myUpdateString = "SELECT * FROM " + tableName + ""; 

      SQLiteDataAdapter myAdapter = new SQLiteDataAdapter(myUpdateString, myConnection); 

      SQLiteCommandBuilder comBuild = new SQLiteCommandBuilder(myAdapter); 

      myAdapter.DeleteCommand = comBuild.GetDeleteCommand(true); 
      myAdapter.UpdateCommand = comBuild.GetUpdateCommand(true); 
      myAdapter.InsertCommand = comBuild.GetInsertCommand(true); 

      myAdapter.Update(sourceTable); 

      myConnection.Close(); 

      if (newOrEdit == true) 
      { 
       MessageBox.Show("Klasse erstellt!"); 
      } 
      else 
      { 
       MessageBox.Show("Klasse aktualisiert!"); 
      } 

     } 
     catch (SQLiteException e) 
     { 
      MessageBox.Show(e.ToString()); 
     } 

    } 

Im Codeblock zum Manipulieren von Daten finden Sie die Methode . Zu diesem Zeitpunkt sind meiner Datentabelle möglicherweise keine weiteren Änderungen aufgetreten. Nach dem Start der App kann das Löschen einer Zeile die erste Aktion des Benutzers sein.

Außerdem: Jeder Eintrag in meinem Dataset ist eindeutig (Schulklassen, die mit einem eindeutigen Klassennamen gekennzeichnet sind).

Jede Hilfe wird sehr geschätzt!

Grüße,

Aran

+0

also, wie sieht _myAdapter.DeleteCommand_ aus? – TaW

+0

@TaW - Soweit ich weiß, sollte myAdapter.DeleteCommand = comBuild.GetDeleteCommand (true) den Trick machen? (Es ist im dritten Codeblock, nahe am Ende) -> Ich bin mir nicht sicher, aber brauche ich einen speziellen Löschbefehl trotz dieser? –

+0

Können Sie in seine Eigenschaften schauen? Sie sollten in der Lage sein, die Löschung sql dort zu sehen. – TaW

Antwort

0

OK - so gelang es mir (endlich). Das Debugging zeigte keine Probleme, außer für AcceptChanges(), das einen Aufruf erhielt, aber nicht dazu führte, dass dataRow tatsächlich gelöscht wurde.

Alles was ich jetzt denken kann ist, dass meine primäre Herangehensweise Teil des Problems war: Ich bekomme meine DataTable direkt von der Datenbank, mache alle Manipulationen damit und schicke sie dann per Update an die DB zurück (Siehe meine Update-Methode oben). Der SQLite CommandBuilder scheint nicht in der Lage zu sein, meinen DAtarow zu interpretieren, der zu diesem Zeitpunkt als 'Gelöscht' gekennzeichnet ist, aber eine Art Gummistempel an das Ende der Methode schreibt, ohne eine Ausnahme auszulösen.

Dadurch habe ich versucht, die GetChanges-Methode:

DataRow[] dr = killTable.Select("" + cmVariables.ClassName + " = '" + cmbClasses.Text + "'"); 

      string indexName = (killTable.Rows.IndexOf(dr[0])).ToString(); 

      int i = Int32.Parse(indexName); 

      killTable.Rows[i].Delete(); 

      DataTable killItTable = killTable.GetChanges(DataRowState.Deleted); 

      killClass_Execution(killItTable, cmbClasses.Text, ShortClassNm); 

Jetzt ist es funktioniert - die Kopie von killTable (killItTable - dumm ich weiß, aber erste, was ich morgen früh tun, ist es besser, Namen geben :)) liefert Informationen für den sql commandbuilder, die von ihm erkannt werden. Was auch immer es ist - es funktioniert jetzt.

Ich denke, das soll nicht passieren - wenn jemand irgendwelche guten Vorschläge machen kann, wie ich meinen Ansatz verbessern kann, werde ich froh sein. mit freundlichen Grüßen