Autor |
Beitrag |
beate007
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 20.08.08 07:51
Hallo,
ich suche nun schon Stunden nach einer Lösung für mein Problem finde aber keins.
Ich möchte gern ein Update auf meine Datenbank machen, es funktioniert allerdings die "Update"-Methode nicht, weil meine Datenbank über 40 Spalten hat.
Kann mir vielleicht irgendwer weiterhelfen. Wäre auch über Codebeispiele sehr,sehr dankbar.
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Mi 20.08.08 08:42
Hallo beate
Mach doch ein Update und dann für den Rest Insert.
Du hast doch sicher eine Id.
Beim Update schichst du die ID und ein paar Spalten in die Datenbank. Dann machst du eine Insert Abfrage mit weiteren Spalten mit dem Kriterum der vorher erstellten ID.
Gruss Lothi
|
|
beate007 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 20.08.08 10:45
Hallo,
Die Datenbank hat keine ID und sonst nichts eindeutiges.
Ich weiß, dass es eine extrem schlecht angelegte Datenbank ist, aber ich hab sie nicht gemacht, muss aber mit ihr arbeiten!
Hast du vielleicht noch andere Vorschläge?
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Mi 20.08.08 12:09
Naja so als fantasieloser Bastler hätte ich da noch eine Idee in dem du im SQL den Befehl LAST() brauchst. So wird das Insert an den letzten Eintrag durchgeführt.
|
|
beate007 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 20.08.08 13:35
nochmals danke
aber nach langer sucherei geht es anscheinend wenn man statt einer odbcConnection eine OleDbConnection macht.
Kann mir vielleich wer diesen Connection string auf einen OleDbConnection-String umbauen? Ich schaffs irgendwie nicht so wirklich.
C#-Quelltext 1: 2:
| cn = new OdbcConnection("Driver={Microsoft Access Driver (*.mdb)};" + "DBQ=" + path + ";UID=;PWD=;"); |
Dankeschön
Moderiert von Tino: CS-Tags hinzugefügt.
|
|
beate007 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 20.08.08 13:38
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Mi 20.08.08 13:44
Und mit OleDB geht's jetzt?
|
|
beate007 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 20.08.08 14:01
weiß ich leider noch nicht
irgendwas geht jetzt mit dem reader wieder nicht.
Beim Durchlaufen des Reader bekomm ich diese Fehlermeldung:
An unhandled exception of type 'System.InvalidCastException' occurred in system.data.dll
Additional information: The data value could not be converted for reasons other than sign mismatch or data overflow. For example, the data was corrupted in the data store but the row was still retrievable.
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Mi 20.08.08 14:55
(hät ich bloss nicht nachgefragt)
Ja da kann ich hier von Birgisch aus nicht viel helfen ausser:
msdn.microsoft.com/d...6y8t7kbw(VS.80).aspx
Gruss Lothi
|
|
beate007 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 21.08.08 08:23
Danke erst mal
Hab das Problem jetzt gelöst aber das mit dem OleDb geht eh trotzdem nicht.
habs jetzt folgendermaßen probiert:
wenn man auf den Open button klickt öffnet sich die Datenbank.
Hier mein Code (beim open-button):
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| msg = "SELECT * " + "FROM ApplSettings_Apod " + "WHERE ProbeID = " + name + " AND ApplicationID = " + comboBoxApplication.SelectedItem.ToString(); dt2 = new DataTable(); ap2 = new OleDbDataAdapter(msg,cn); ap2.Fill(dt2); dataGrid1.DataSource = dt2; |
dann gibt es da noch einen update-Button; wenn man jetzt direkt im Datagrid änderungen vornimmt und auf den update-button klickt soll sich die datenbank ändern - tut sie aber nicht
Hier mein Code (beim update-Button):
C#-Quelltext 1: 2: 3: 4: 5:
| foreach (DataRow row in dt2.Rows) { ap2.UpdateCommand = new OleDbCommand("UPDATE ApplSettings_Apod",cn); dt2.AcceptChanges(); } |
Hast du eine Ahnung was da falsch sein kann?
vielen dank schon mal jetzt!
lg
Moderiert von Kha: C#-Tags hinzugefügt
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Do 21.08.08 09:09
Guten Morgen Beate007
Es gibt ein kleines Problem an deinem Problem. Dir fehlen einfach die Grundlagen.
Ich hoffe nur du testest das ganze nicht an den Orginaldaten. Falscher SQL Befehl und flutsch sind die Daten Schrott.
Schau dir auch das an:
msdn.microsoft.com/d...ibrary/bb979090.aspx
und unbeding der ganze Kram über DataSet, DataTable.
Hier auf dieser Seite findest du unten ein Beispiel das genau das macht was du willst.
www.csharp-station.c...DotNet/Lesson05.aspx
Gruss Lothi
|
|
beate007 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 21.08.08 10:54
Soweit wie beim Beispiel war ich schon
Aber der update-Befehl funktioniert nicht bei mehr als 40 spalten das ist mein problem
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Do 21.08.08 11:59
Ja und jetzt sind wir wieder am Anfang.
Du musst das Update aufteilen in kleine Häppchen.
Wird denn im Grid die ganze Zeile geändert?
Schaufelst du die ganze Tabelle zurück oder nur die geänderte Zeile?
So wie du gesagt hast kannst du die DS in der Tabelle nicht eindeutig erkennen also musst du alle DAten aktualisieren.
zb
Update tblt
SET( Spalten1,...,Spalte20)
VAlUES(Werte)
Dann
Update tblt
SET( Spalten21,...,Spalte40)
VAlUES(Werte)
Der User muss natürlich eine gewisse Gedult aufbringen bis das ganze Aktualisiert ist.
Du sagst es ist eine Accestabelle? Auf die hast du keinen Einfluss? Aber du hast zugriff auf die Tabelle? Wenn ja füge frech eine AutoWert-Spalte hinzu und du bist alle Probleme los. Kein Mensch stört diese Spalte kein Mensch sieht diese Spalte und nichts aendert sich an der ganzen Sachen.
Gruss Lothi
|
|
beate007 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 21.08.08 12:24
habe nur gehofft dass es irgendwie schneller geht und dass ich nicht die spaltennamen jedes mal eintippsen muss weil sich die ständig ändern in der db
aber danke auf jedn fall
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Do 21.08.08 12:31
Also jetzt muss ich doch mal fragen.
Ihr habt eine Access Tabelle mit mehr als 40 Spalten ohne eine möglichkeit den DS zu erkennen und bei der noch dauernd die Namen der Spalten wechseln?
Ich weiss nicht, aber das kann doch nicht gut gehen.
Gruss Lothi;der extrem erstaunt ist das es so etwas gibt.
|
|
beate007 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 21.08.08 13:00
bin auch schon gespannt ob das gut geht - aber an der db kann ich leider nicht rumpfuschn
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Do 21.08.08 13:34
Naja rumpfuschen nicht. Nur für dich geradebiegen.
Da brauchst nicht gespannt zu sein das geht in die Hosen. (oder Rock?)
Ist das Privat oder Geschäft?
Gruss Lothi
|
|
beate007 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 22.08.08 10:59
hallo,
sorry dass ich schon wieder stör (oder nerv).
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| hab das mitn update jetzt gemacht - schaut so aus:
foreach(DataRow row in dt2.Rows) { string rowSt = row.RowState.ToString(); if(rowSt.Equals("Modified")) { string id = row[0].ToString(); string id2 = row[1].ToString();
string msg = "UPDATE ApplSettings_SRI " + "SET " + "ProbeID =" + id + "," + "ApplicationID =" + id2; ap2.UpdateCommand = new OleDbCommand(msg,cn); DataTable changes = dt2.GetChanges(); ap2.Update(changes); } } |
wenn ich jetzt z.B.: in der ersten Zeile die ProbeID auf 22 ändere und in der zweiten zeile auf 45 werden sämtliche Zeilen auf die ProbeID 45 upgedatet.
Ich erkenn das Problem an meinem Code auch weiß aber nicht so recht wie ich ihn ändern soll?
Wär dir nochmal sehr dankbar für hilfe
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Fr 22.08.08 12:16
Guten Tag
Das ist normal mit dem Update Befehl. Ohne Where klausel wird alles aktualisiert.
www.sql-und-xml.de/s...eren-der-zeilen.html
Gruss Lothi
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 22.08.08 14:06
beate007 hat folgendes geschrieben: | sorry dass ich schon wieder stör (oder nerv). |
Kein Problem, dafür sind wir schließlich hier  . Was uns allerdings eher stört, sind mehrere Fragen im selben Thread, die nicht mehr zur Überschrift passen und meistens dann ein ziemliches Durcheinander auslösen. Sollte also lothi deine Frage nicht sowieso schon beantwortet haben, bitte ich dich, dafür ein neues Thema zu eröffnen.
Sebastian
|
|