Hallo,
ich will im vs 2005 Daten ,die ich in einem DataGridView anzeige, nach dem editieren mit tmptableAdapter.Update(meineTablle); in die Datenbank schreiben.
Das klappt leider nicht. Ich habe es zuvor manuell implementiert, funktioniert einwandfrei ohne Update(). Jedoch denke ich das es nicht im Sinne des Erfinders ist. Die Methode Fill() des tableAdapters funktionier bei mir, wieso die Update() nichts macht - verstehe ich nicht.
Das aufrufen der Methode AcceptChanges() des DataSets nachdem editieren, vor dem Aufruf der Update() -Methode hat auch nichts gebracht.
Wenn ich dem Sinn von Update() und Fill() richtig verstanden habe:
1.) reicht die Methode Fill() die Daten aus der DB an eine Tabelle im DataSet.
Die Daten werden wie auch immer an z.B das DataGridView weitergereicht wobei der DataConnector hier wohl eine Rolle spielt.
2.) Update soll sich die Daten aus einer Tabelle im DataSet holen, die dann in die DB geschrieben werden.
Habe ich da was falsch verstanden?
hat jemand eine Idee wiso mein Update nicht funktioniert?
oder wie er richtig funtioniert?
Hast du den Adapter mit den entsprechenden Update, Insert und Delete Command versehen? Wenn du das ganze im Visual Studio.NET generieren lässt, dann baut er dir diese Commands mit ein. Machst du das hingegen manuell, dann musst du vorm Update() auch die entsprechenden Command erstellen.
Das .NET Framework stellt dir hierfür einen SqlCommandBuilder zur Verfügung:
SqlCommandBuilder cb = new SqlCommandBuilder( deinDataAdpter );
deinDataAdapter.Update( deinDataSet, "DeineTabelle" );
Sample ist ungetestet!
Ja,
der tableadpter wurde zusammen mit dem DataSet vom Assistenten erstellt.
Also die Commands sind als Member-Variable in meiner Klasse xytableadapter vorhanden.
Bekommst du eine Fehlermeldung oder sowas? Welche Datenbank?
Nein, keine Fehlermeldung keine Exception
Kannst du uns dein Code zu Verfügung stellen?
Nur um zu wissen ob ich dein Problem verstanden habe.:
Du hast also eine DataGridView und die entsprechenden TableAdapter usw. (wurden von VS.NET erstellt?) angelegt.
Nun hast du neue Datensätze im DataGridView eingefügt und ein Button mit einem Update Befehl auf die jeweilige Tabelle durchgeführt?
Nun werden diese neuen Datensätze aber nicht eingefügt in deiner Datenbank?
Kannst du schon vorhandene Datensätze ändern?
Und wie schon gefragt: Welche Datenbank wird benutzt?
hm also
Code welchen Teil? also das DataSet besteht so ca. aus 25 Seiten..
ja das DataGridview(DGV) wurde mit vs.net erstellt ist mit entsprechendem dataconnector verbunden, der mit dem DataSet wiederrum verbunden ist.
3.) Ich füge daten aus einer Tabelle in das DGV. Nachdem ich die Ansicht verlassen und wenn Zellen editiert wurden will ich die (jetzt editierten daten) in DB schreiben, wie gesagt ich habe es manuell implementiert funtz, aber eigentlich sollte es auch denke ich mit update() funzen.
4.) die Daten werden leider nicht in die DB eingefügt.
5.) 6.) Also ich lese Werte, die schon vorhanden sind in meiner DB, aus. Stelle sie in meinem DGV dar(mit Fill()). Nachdem sie editiert wurden wird Update() aufgerufen aber die Änderungen werden nicht übernommen.
7.) Als Datenbank verwende ich MS SQLEXPRESS die ich mit dem VS 2005 mitinstalliert habe.
Hast du mal im Debug Modus dir das DataSet angsehen? Sind die Werte darin auch geändert worden?
Ich habe mir gerade das DataSet im Debug angeschaut, die Werte haben sich in dem DataSet nicht geändert.
Aber Wieso?
Dachte mit AcceptChanges() wäre die Sache erledigt...
Da liegt wohl das Problem das die Daten erstmal garnicht im DataSet geändert wurden.
Die Update -Methode holt sie ja die Daten aus dem DataSet zum schreiben in die DB.
Wie kann ich dem DataSet sagen das es die änderungen aus dem DGV ins DataSet übernehmen soll? ausser mit AccepChanges() ?
Wie schreibst du denn die Daten in das DataSet? Hier wäre jetzt wohl Code interessant 😁
Ja 8) keine schlechte Stelle.
Also das mit dem Schreiben der Daten ins DataSet ist ne gute Frage. Das habe ich selber noch nicht so raus ⚠
itemText = listBox1.Text; // Name des Items holen
string tabAbfrage = (" INSERT INTO dbo.tmpFields (ID,Bezeichner,dtyp,Ind,Tav,Status) (SELECT * FROM dbo.Fields WHERE Tav = '" + itemText + "')");
SqlConnection conn = new SqlConnection("Data Source=compas-e01\\sqlexpress;Database=pdb;Integrated Security=true");
SqlCommand cmd = new SqlCommand(tabAbfrage, conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
this.tmpFieldsTableAdapter.Fill(this.pDBDataSet.tmpFields);
Also ich hole mir aus der Tabelle Fields eine Selcetmenge. Schreibe Sie mit Insert in die Tabelle tmpFields rein. Dann rufe ich mit dem TableAdapter die Methode Fill auf.
Die gewünschten Daten erscheinen im DGV.
So, wenn ich es richtig verstanden habe holt sich die Methode Fill die Daten aus dem DataSet. Also landen die Daten im DataSet nachdem ich cmd.ExecuteNonQuery() absetzt habe. oder?
Die Methode Fill() schreibt die Daten die es per Command über den Adapter bezieht in ein DataSet.
Im Prinzip musst du die Daten im DataSet ändern. Hier mal ein kleines ungetestetes Beispiel:
//DataSet ist gefüllt und die Tabelle heißt Customers
//Dritte Zeile raus ziehen
DataRow row = ds.Tables["Customers"].Rows[2];
//Werte verändern
row["CompanyName"] = "Neuer Firmen Name";
row["ContactName"] = "René Paschold";
//Bin mir hier nicht sicher ob es evtl. ds.Tables["Customers"].AcceptChanges()
//heißen muss.
ds.AcceptChanges();
Jetzt sollten eigentlich die Werte der dritten Zeile geändert worden sein. Kurze Erklärung: Objekte werden immer als Referenz übergeben. Deine row im gezeigten Beispiel ist also nur ein Verweis auf die Daten, die schon im DataSet hinterlegt sind. Du überschreibst diese und somit ist auch das DataSet geändert.
Für die Logik, sprich für das "erkennen" welcher Datensatz geändert werden soll, musst du selber sorgen. Du kannst dir mal den BindingManagerBase() ansehen wie das DataBindung unter Windows manipuliert werden kann, oder du ermittelst den entsprechenden Index.
Sollte soweit alles funktionieren.
Rene das ist fast richtig.
Das befüllen des Dataset's bzw. das ändern der daten ist so schon richtig.
Du kannst wie Du das schon gezeigt hast einen Datensatz ändern.
Du Kannst auch mit
ds.Tables["Customers"].Rows[2].Delete();
eine Zeile löschen, und mit
DataRow dr = ds.Tables["Customers"].NewRow();
einen neuen Datensatz hinzufügen.
Das DataSet merkt sich jetzt die Änderung jeder einzelnen Row in einem
Feld RowState.
Wenn Du jetzt entweder
ds.HasChanges();
ds.Tables["Customers"].HasChanges();
aufrufst bekommst Du angezeigt,
ob sich was geändert hat.
Du kannst Dann auch per DataAdapter.Update() diese änderunge speichern.
Wenn Du aber
ds.AcceptChanges();
aufrufst, werden diese Marker gelöscht, so das jetzt nicht mehr bekannt ist, was sich geändert hat.
Im Debugger kannst Du auch häufig nicht das richtige sehen.
Du kannst aber mal das DataSet als XML-Diffgram speichern,
ds.WriteXml("ds.xml", XmlWriteMode.DiffGram);
Dann siehst Du alle Änderungen mal im klartext.
aber bitte vor demAdapter.Update() oder AcceptChanges
Hallo,
ich habe es so gelöst:
string[] tmpZeile = new string[6];
tmpZeile[0] = this.tmpFieldsDataGridView.Rows[curRow].Cells[0].Value.ToString();
tmpZeile[1] = this.tmpFieldsDataGridView.Rows[curRow].Cells[1].Value.ToString();
tmpZeile[2] = this.tmpFieldsDataGridView.Rows[curRow].Cells[2].Value.ToString();
tmpZeile[3] = this.tmpFieldsDataGridView.Rows[curRow].Cells[3].Value.ToString();
tmpZeile[4] = this.tmpFieldsDataGridView.Rows[curRow].Cells[4].Value.ToString();
tmpZeile[5] = this.tmpFieldsDataGridView.Rows[curRow].Cells[5].Value.ToString();
string insertCommand = ("UPDATE dbo.Fields SET ID = '" + tmpZeile[0] + "',Bezeichner = '" + tmpZeile[1] + "',dtyp ='" + tmpZeile[2] + "',Ind ='" + tmpZeile[3] + "',Tav ='" + tmpZeile[4] + "',Status='" + tmpZeile[5] + "' WHERE ID ='" + tmpZeile[0] + "'");
SqlCommand cmd = new SqlCommand(insertCommand, this.tmpFieldsTableAdapter.Connection);
this.tmpFieldsTableAdapter.Connection.Open();
cmd.ExecuteNonQuery();
this.tmpFieldsTableAdapter.Connection.Close();
Funktioniert auch einwandfrei, aber das ist nicht das was ich will! Das ist ja eine "manuelle" Lösung denke ich. Ich will es mit einem UPDATE Commando des TableAdapter erledigen, dafür ist er ja denke ich da. Ich habe jetzt rausgekriegt wie man ein UpdateCommando als Methode dem Tableadapter hinzufügt, soweit so gut. Funktionieren tut es bis jetzt immer noch nicht.
FZelle: ich will keine Zeilen löschen oder hinzufügen, sondern werte aus meinem DGV die sich verändert haben "aktualisieren" das ganze dann mit der Update(dataTable) Methode des TableAdapters.
@FZelle
Ich weiss, ich wollte ihm ja nur einen Einblick verschaffen. Es gibt verschiedene Lösungsansätze allerindgs bräuchte man Tage un diese zu beschreiben. Du hast natürlich Recht die Möglichkeiten die hier geboten werden sind sehr sehr vielseitig.
@Dud2
Schau dir mal FZelles und mein Beispiel an, das wäre genau die Lösung die du haben möchtest. Ohne Programmierung allerdings geht es nicht, sonst wäre unser Berufsstand überflüssig.
Und schau dir noch das DataBinding an. Wenn du richtig bindest kannst du direkt über Grid, TextBoxen usw. den Wert im DataSet ändern ohne manuell was programmieren zu müssen.
Vielen Danke für die Beispiele und Tips.
Ich dachte das die Update() "trivial" wäre, wie die Fill().
Ich schaue mir das DataBinding genauer an und das mit dem rausschreiben der XML-Datei ist auch ne gute Idee.
Nun, das es da verschiedene Konzepte gibt fange ich an zu realisieren, das blöde ist das man sie noch nicht in Form eines Buches ( vs 2005 ist ja noch beta) nachlesen kann.
Die zugehörige MSDN nicht immer vollständig oder nicht ausführlich ist.
Im Netz findet man zur ADO.Net 2 so gut wie garnichts, leider.
Ich weiß das es eigentlich nicht so ganz in dem Thread rein paßt: aber wenn jemand infos zu ADO.Net 2 im Netz findet immer her damit.
Für Dude2:
Nun die Vorgehensweise bei ADO 2.0 ist genau die Gleiche wie bei ADO 1.0.
Es gibt auch weiterhin Adapter, Connections und so weiter.
Es gibt jetzt nur noch ein paar weiter Strukturen, die das zusammenfassen,
wie der Connector.
Und ob das ding nun DataGrid oder GridView heist, ist echt nebensächlich.
Es wird nur schon mehr in der IDE angelegt, und es wird etwas komplexer
dargestellt, aber wenn Du das Prinzip in ADO.NET 1.0 verstanden hast,
wirst Du damit in 2.0 auch zurechtkommen.
Original von FZelle
Und ob das ding nun DataGrid oder GridView heist, ist echt nebensächlich.
Wieso nebensächlich?
DataGrid und DataGridView sind 2 eigenständige Steuerelemente.
Das ist schon richtig, und die haben auch unterschiedliche Properties,
Funktionen usw. aber die grundsätzliche herangehensweise beim Laden und Speichern
der angezeigten Daten hat sich nicht geändert.
Auch TextBoxen und DataGrid sind unterschiedlich, aber wenn man das mit
dem DataBinding mal verstanden hat, ist es egal welches kontroll man für die
eingabe benutzt.
Das meinte ich damit.
Achso, dann hast Du natürlich Recht, mein Fehler. 😁
Hallo,
Ich hab das selbe Problem, hab den Code wie folgt geschrieben.
Der Compiler bringt keine Fehlermeldung wunderbar, aber wäre nicht die Kleinigkeit, dass der meine Datenbank nicht updaten will. Ich weiß nicht woran es liegen könnte, weil, wie gesagt, es keine Fehlermeldung gibt. Ich hoffe es kann mir jemand weiterhelfen
Vielen Dank im Voraus
Jaden
//Ihr könnte davon ausgehen, dass alle Variablen deklariert sind und die Verbindung funktioniert
Connection.Open();
System.Data.Odbc.OdbcDataReader rdr;
rdr = Command.ExecuteReader();
while(rdr.Read())
{
string a = rdr["MannschaftsNr"].ToString();
if(a == treeView1.SelectedNode.Tag.ToString())
{
DataRow targetRow = ds.Tables[0].Rows[i];
targetRow["Mannschaftsbez"] = textBox3.Text.ToString();
System.Data.Odbc.OdbcTransaction trans = null;
cn.Open();
try
{
trans = cn.BeginTransaction();
ds.AcceptChanges();
trans.Commit();
}
catch(System.Data.Odbc.OdbcException ex)
{
MessageBox.Show(ex.Message);
trans.Rollback();
}
i=i+1;
cn.Close();
}
}
treeView1.Nodes.Clear();
mitSaisonTreeViewBefuellen();
}
}