Autor Beitrag
beate007
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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.

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 20.08.08 13:38 
OK habs schon geht so:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: Mi 20.08.08 13:44 
Und mit OleDB geht's jetzt?
beate007 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: 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:
msdn.microsoft.com/d...6y8t7kbw(VS.80).aspx

Gruss Lothi
beate007 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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):


ausblenden 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):


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 21.08.08 13:00 
bin auch schon gespannt ob das gut geht - aber an der db kann ich leider nicht rumpfuschn
lothi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 22.08.08 10:59 
hallo,

sorry dass ich schon wieder stör (oder nerv).


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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.