Autor Beitrag
rittergig
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Fr 30.03.12 20:12 
Ich habe schon viel mit Datenbanken gearbeitet, allerdings habe ich bis jetzt immer Linq to SQL oder Entity Framework verwendet.
Nun muss ich auf ADO.NET zurückgreifen und möchte mit DataSets einen Eintrag in einer Tabelle hinzufügen.

Ich versuche vergeblich mit ADO.NET und DataSets eine Zeile in eine Tabelle einzufügen.
Mein Code lässt sich kompilieren und es tritt auch keine Fehler auf, aber die Zeile
wird nicht in die Datenbank geschrieben. Die Tabelle "Students" ist weiterhin leer.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
using (SqlConnection sqlConnection = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
  sqlConnection.Open();

  try
  {
    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("Select * From Students", sqlConnection);
    DataSet dataset = new DataSet();
    sqlDataAdapter.FillSchema(dataset, SchemaType.Source, "Students");
    DataTable channelSetTable = dataset.Tables["Students"];

    // Neuen Schüler anlegen
    DataRow newRow = channelSetTable.NewRow();
    newRow["Forename"] = "Max";
    newRow["Surname"] = "Mustermann";
    newRow["Birthdate"] = DateTime.Parse("18.01.1995");
    channelSetTable.Rows.Add(newRow);

    // In DB überführen
    dataset.AcceptChanges();
    sqlDataAdapter.Update(channelSetTable);
  }
  finally
  {
    sqlConnection.Close();
  }
}


Eigentlich sollte mit der Zeile 21 ("sqlDataAdapter.Update(channelSetTable)") die neue Zeile
in die Datenbank eingefügt werden. Wird es aber nicht.

Warum? Was mache ich falsch?

Ich verstehe auch nicht, warum ich im Konstruktor von SqlDataAdapter unbedingt einen Select-Befehl eingeben muss.

Grüße, Peter
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 30.03.12 20:36 
Mit AcceptChanges hast du im Dataset den Bearbeitungszustand aller Daten auf aktuell gesetzt. Es gibt danach also nichts mehr zum updaten. Lass das weg oder mach es zumindest erst nach dem sqlDataAdapter.Update.
rittergig Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Fr 30.03.12 20:58 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Mit AcceptChanges hast du im Dataset den Bearbeitungszustand aller Daten auf aktuell gesetzt. Es gibt danach also nichts mehr zum updaten. Lass das weg oder mach es zumindest erst nach dem sqlDataAdapter.Update.


Klingt plausibel. Aber ohne die Zeile mit AcceptChanges habe ich immer bei Update() die Exception bekommen, dass ein Insert-Befehl benötigt wird (ich kanns jetzt leider nicht genau vorlesen).
Muss ich dann ein Insert-Befehl beim dataAdapter übergeben?

Irgendwie blicke ich bei ADO.NET nicht durch.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 30.03.12 21:11 
Na klar brauchst du ein InsertCommand. Entweder selbst schreiben oder, bei einer simplen direkten Tabellenzugriff wie hier, einfach den DataAdapter durch einen SqlCommandBuilder jagen um sich die Commands zu generieren.

Dein Code um einen Datensatz in die Datenbank zu bringen ist aber unnötig kompliziert. Dafür braucht man sicher kein Dataset/Datatable/DataAdpater etc. sondern einfach nur ein simples Command.