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
also, wie sieht _myAdapter.DeleteCommand_ aus? – TaW
@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? –
Können Sie in seine Eigenschaften schauen? Sie sollten in der Lage sein, die Löschung sql dort zu sehen. – TaW