Delow Geschrieben 25. Januar 2010 Geschrieben 25. Januar 2010 Hallo ihr, dies ist mein erster Beitrag hier im Forum, also bitte entschuldigt eventuelle formale Fehler und co. Also ich bin im ersten Jahr als Fachinformatiker tätig und habe nun ein Problem. Ich habe eine Datenbank in der Daten über Personen stehen. Da diese bald für eine Präsentation sichtbar werden, muss ich diese nun verändern aufgrund von Datenschutzrichtlinien. Primär geht es mir darum, dass ich Vorname und Nachname änder, bzw. ganz einfach die Spalte Nachnamen von unten nach oben Schreibe. Dies hab ich auch ganz gut hinbekommen, allerdings krieg ich die Daten jetzt nicht mehr in die Datenbank hinein (Access Datenbank). Also ich will jetzt in die selbe Datenbank schreiben!!! Hier erstmal der Quellcode: da.Fill(changer, "Kind_ID"); da.Fill(changer, "K_Vorname"); da.Fill(changer, "K_Name"); dtRichtig = changer.Tables["Kind_ID"]; dtRichtig = changer.Tables["K_Vorname"]; dtRichtig = changer.Tables["K_Name"]; if (dtRichtig.Rows[0][0].ToString().Length > 0) { iPrimaryID = (int)dtRichtig.Rows[0][0] + 1; } else { iPrimaryID = 1; } int iAnzahl = dtRichtig.Rows.Count; for(int i=1;i<iAnzahl;i++) { DataRow dwChanger = dtRichtig.NewRow(); dwChanger["K_Vorname"]=changer.Tables["K_Vorname"].Rows[i]["K_Vorname"]; dwChanger["K_Name"] = changer.Tables["K_Name"].Rows[iAnzahl - i]["K_Name"]; dtRichtig.Rows.Add(dwChanger); da.InsertCommand = ocb2.GetInsertCommand(); iPrimaryID++; } So eingentlich woltle ich nichts mit dem Primarykey machen, also mit der Kind_ID. Aber nachdem ich den Fehler bekommen habe, dass der Primarykey doppelt ist, habe ich einen eingefügt. Jetzt bekomme ich bei der Primarykey abfrage, folgenden Fehler: Die angegebene Umwandlung ist ungültig Ich denk das ist ein kleiner fehler, allerdings hab ich solangsam bedenken, dass der Code generell falsch ist... Ich hoffe ihr könnt mir helfen... VIELEN DANK schonmal !!! Gruß DeLow Zitieren
Delow Geschrieben 25. Januar 2010 Autor Geschrieben 25. Januar 2010 (bearbeitet) Dazu kommt noch, das er einen Eintrag schreibt. Sowie ich das haben will... FAST! Irendwie setzt er die Daten KOMPLETT NEU anstatt zu Verändern... Ich will halt die alten Daten genauso lassen, nur die Spalte "K_Name" ändern... hab jetzt bisschen was verändert.. hier nochmal da.Fill(changer, "K_Name"); CopyDataSet(changer); dtRichtig = changer.Tables["K_Name"]; int iAnzahl = dtRichtig.Rows.Count; for(int i=1;i<iAnzahl;i++) { dtRichtig = changer.Tables["K_Name"].Rows[iAnzahl - i]["K_Name"]; //dwChanger["K_Name"] = changer.Tables["K_Name"].Rows[iAnzahl - i]["K_Name"]; da.InsertCommand = ocb2.GetInsertCommand(); } da.Update(dtRichtig); da.Dispose(); conn.Close(); Was mache ich falsch... jetzt kommt auch ein andere Fehler.. ERROR[23000][MYSQL][ODBC 3.51 Driver][mysqld-5.1.30-communitiy]Duplicate entry '0' for key 'PRIMARY' Ich hab echt keine Ahnung was das soll? Vielleicht ein Copy vom DataSet machen? Allerdings hab ich davon keine Ahnung und versteh nur schlecht wie das gehen soll laut msdn. Ich hab echt keine Ahnung:( Bitte HILFE!!! Bearbeitet 25. Januar 2010 von Delow Zitieren
grueni Geschrieben 25. Januar 2010 Geschrieben 25. Januar 2010 (bearbeitet) Ist dir eigentlich der Unterschied zwischen einem INSERT und einem UPDATE klar? <edit> Und außerdem paßt die ODBC-Fehlermeldung nicht wirklich zu MS-Access. </edit> Bearbeitet 25. Januar 2010 von grueni Zitieren
Delow Geschrieben 25. Januar 2010 Autor Geschrieben 25. Januar 2010 (bearbeitet) Okay stimmt... ziemlich dummer Fehler von mir. Ja Update brauch ich ja... Dann hab ich jetzt eine andere Frage... Ich will ja jetzt die Daten aktualisieren. Ist eine for-schleife die bessere oder die foreach? Mit foreach hab ich das Problem, dass ich die datarow verwenden will, aber man darf ja nicht die Collections einer foreach schleife verändern. Jetzt besteht mein Fehler hier: for(int i=1;i<iAnzahl;i++) { DataRow dw; dw = dtRichtig.NewRow(); dw["K_Name"]=changer.Tables["K_Name"].Rows[iAnzahl - i]["K_Name"]; } da.Update(dtRichtig); da.Dispose(); conn.Close(); } Bearbeitet 25. Januar 2010 von Delow Zitieren
Argbeil Geschrieben 28. Januar 2010 Geschrieben 28. Januar 2010 Hi, mir fallen viele Dinge auf die nicht ganz rund sind an dem Code (aber es ist gut das du den SQL Code nicht von Hand generierst!) * Auf den DataAdapter brauchst du nicht Dispose aufzurufen, das passiert automatisch wenn die Referenz aus dem aktuellen Scope läuft * conn.Close brauchst du nicht aufrufen sofern du die Connection nicht vorher mit Open geöffnet hast. Wenn die Connection im State Closed ist macht der DataAdapter sie automatisch selbst auf und schließt sie auch wieder. * Die ganze Ressourcenbereinigung sollte in einem finally Block geschehen, ideal ist hierfür das using-Schlüsselwort Das sind aber nur Kleinigkeiten, dein Code in der for-Schleife macht keinen Sinn weil die neue DataRow bei jedem Durchlauf wieder überschrieben wird. Willst du die neue Row in das Dataset einfügen dann musst du noch die Add Methode des Datasets aufrufen. Deine Frage hast du schon selbst beantwortet. Wenn du in einer Schleife die Collection selbst ändern willst ist eine foreach Schleife nicht geeignet. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.