Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Datenbank zu viel Spalten für Update


beate007 - Mi 20.08.08 07:51
Titel: Datenbank zu viel Spalten für Update
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 - 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 - 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 - 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 - 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 user profile iconTino: CS-Tags hinzugefügt.


beate007 - Mi 20.08.08 13:38

OK habs schon geht so:


C#-Quelltext
1:
cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + path);                    


Moderiert von user profile iconTino: C#-Tags hinzugefügt


lothi - Mi 20.08.08 13:44

Und mit OleDB geht's jetzt?


beate007 - 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 - Mi 20.08.08 14:55

(hät ich bloss nicht nachgefragt) :D

Ja da kann ich hier von Birgisch aus nicht viel helfen ausser:
http://msdn.microsoft.com/de-de/library/6y8t7kbw(VS.80).aspx

Gruss Lothi


beate007 - 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 user profile iconKha: C#-Tags hinzugefügt


lothi - 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:
http://msdn.microsoft.com/de-de/library/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.

http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson05.aspx

Gruss Lothi


beate007 - 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 - 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 - 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 - 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 - Do 21.08.08 13:00

bin auch schon gespannt ob das gut geht - aber an der db kann ich leider nicht rumpfuschn


lothi - 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?) :lol:
Ist das Privat oder Geschäft?

Gruss Lothi


beate007 - 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();
          //string strID = row["ProbeID"].ToString();

          if(rowSt.Equals("Modified"))
            //if(strID == "50332172") 
          {
            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 - Fr 22.08.08 12:16

Guten Tag

Das ist normal mit dem Update Befehl. Ohne Where klausel wird alles aktualisiert.

http://www.sql-und-xml.de/sql-tutorial/update-aktualisieren-der-zeilen.html

Gruss Lothi


Kha - Fr 22.08.08 14:06

user profile iconbeate007 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