Laden...

Access DB aus C# überschreiben

Erstellt von lucksn vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.723 Views
L
lucksn Themenstarter:in
34 Beiträge seit 2008
vor 16 Jahren
Access DB aus C# überschreiben

verwendetes Datenbanksystem: ACCESS

Hallo liebe mycsharp Community,

wie jeden Tag bisher, habe ich mal wieder ein kleines, bis großes Problem.
Ich habe ein Programm geschrieben welches zur Sicherung Daten in eine lokal gespeicherte Access Datenbank schreibt.
Dort gibt es ein Feld das nicht immer wieder neu gesetzt werden soll, sondern überschrieben und ein 2er Eintrag soll dazu Paarich sein.

Also wenn in Felda ein Wert steht soll Feldb in gleicher Höhe gefüllt werden und nicht neu erstellt.
Diese beiden Werte sollen dann auch nicht immer wieder neu erstellt, sondern generell einfach nur neu gefüllt werden, sodass die Access Tabelle nur eine Zeile letzendlich hat.
Ich hoffe ich konnte mein Problem gut genug umschreiben und hoffe ihr könnt mir aus dieser Patsche helfen.

Falls ein Code oder ein Bild des Problems gebraucht wird, einfch bescheid sagen.
Der Stefan

476 Beiträge seit 2004
vor 16 Jahren

hallo lucksn,

einen neuen Datensatz erstellst du mit INSERT, Wert in bestehenden Datensätzen änderst du mit UPDATE.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

L
lucksn Themenstarter:in
34 Beiträge seit 2008
vor 16 Jahren

Hallo Yellow,

boah danke.
Ich Idiot, das Problem ist jetzt nur, das ich ja eine if Abfrage erstellen muss um das Feld auszulesen (ist schon was eingetragen?!) mache ich dies kommt knallt das Programm und sagt das der Wert in der DB nicht null sein darf.

G
497 Beiträge seit 2006
vor 16 Jahren

wo genau knallts? Ein ganz kleines bisschen Quellcode wäre da schon sinnvoll. Aber wahrscheinlich hast du nur vergessen, irgendwo auf NULL zu prüfen. Oder die Datenbank lässt in einem Feld keine Nullwerte zu und du hast im Insert dieses Feld nicht mit angegeben - das Feld wäre NULL, Datenbank weigert sich. Lösung: Feld übergeben oder NULL in der Datenbank erlauben.

Aber wie gesagt: etwas Quellcode von der Stelle, an der der Fehler auftritt, wäre hilfreich.

476 Beiträge seit 2004
vor 16 Jahren

hallo lucksn,

die Felder A und B existieren? Dann kannst du doch immer ein UPDATE machen, oder erstellst du die Felder neu?

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

L
lucksn Themenstarter:in
34 Beiträge seit 2008
vor 16 Jahren

Also, ich habe es derzeit versucht anders zu lösen, wird die Pause (darum gehts hier) das erste mal aktiviert wird ein Parameter gesetzt.
Dieser weisst dann darauf hin das auch in der Tabelle etwas steht und ab dann nur noch ein Update erfolgen soll.

Da ist nen Syntaxfehler wohl drin (im UPDATE)
Der Code allgemein folgt:


                OleDbConnection conn = new OleDbConnection("provider=Microsoft.JET.OLEDB.4.0;" + "data source=backup.mdb");
                if (actKonfig.FirstPause_is_Activ == false)
                {
                    actKonfig.FirstPause_is_Activ = true;
                    string AccCmd = "INSERT INTO Arbeitszeit (StartzeitTyp2) VALUES('" + StartTimePause + "')";
                    OleDbCommand Typ2cmd = new OleDbCommand(AccCmd, conn);
                    conn.Open();


                    Typ2cmd.ExecuteNonQuery();
                    conn.Close();
                }

            //************Prüfen ob Pause schon aktiviert war und mit der ADB verbinden
           

            if (actKonfig.FirstPause_is_Activ == true)
            {
                string AccCmd = "UPDATE Arbeitszeit (StartzeitTyp2) VALUES('" + StartTimePause + "')";
                OleDbCommand Typ2cmd = new OleDbCommand(AccCmd, conn);
                conn.Open();


                Typ2cmd.ExecuteNonQuery();
                conn.Close();
            }

Und zu deiner Frage Yellow:
Die Felder existieren, sind allerdings beim ersten Start des Programmes (aller erste mal) leer, werden im Laufe der Zeit gefüllt, erster Eintrag soll mit Insert erfolgen (siehe Code) dannach nur noch UPDATE.

Dannach steh ich schon vor nem neueren Problem, aber erstmal will ich das hier hinbekommen, dann kann ich immernoch die nächste Frage stellen.

Was mir nun noch einfiel, ja ein ständiges UPDATE wäre auch möglich, jedoch bekomme ich ja einen Syntax Fehler ausgegeben, leider bin ich nicht so bewandert um es selber zu sehen, wo dieser Syntax Fehler denn ist.

476 Beiträge seit 2004
vor 16 Jahren

hallo lucksn,

wenn die Felder (also ein Datensatz) existieren, dann brauchst du keinen INSERT, da du hiermit einen neuen Datensatz anlegen würdest. Die Syntax deines UPDATE's ist falsch, das stimmt, schau Dir mal in der MSDN die Dokumentation zu UPDATE (Transact-SQL)an.

Zugegeben habe ich aber auch noch nicht ganz verstanden, was du überhaupt machen möchtest. Wenn die Anwendung gestartet wird, willst du die Uhrzeit der ersten Pause in eine Datenbank schreiben? Was ist wenn das Programm erneut gestartet wird? Was ist mit mehreren Pausen?

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

L
lucksn Themenstarter:in
34 Beiträge seit 2008
vor 16 Jahren

Hehe, am liebsten würde ich dir jetzt sagen das ich das selber noch nicht so Recht verstanden habe.
Wenn das Programm gestartet wird, soll die erste Pause gespeichert werden (Button Pause) Richtig.
Wird dann wieder auf Start geklickt, wird die "Endzeit" der Pause gesetzt. Klickt man erneut auf Pause soll, so wie ich das verstanden habe, nur die Zeit (StartzeitPause), das dient wie gesagt auch nur zur Sicherung, in die SQL Datenbank werden andere Werte eingetragen.
Wegen den mehreren Pausen, DA sollte ja das Update zustande kommen.
Wie gesagt, die Felder existieren in der Datenbank, leer. Sie sollen nur bei klick auf die entsprechenden Buttons gefüllt werden.

Bezgl. der Syntax ich war so irritert von den Klammern beim INSERT.
Jetzt funktionierts.

string AccCmd = "UPDATE Arbeitszeit SET StartzeitTyp2='" + StartTimePause + "'";

Verstehe ich das richtig, da das Feld StartzeitTyp2 von Anfang an vorhanden ist (allerdings ungefüllt) benötige nur UPDATE? Genauso fürs andere Feld (FELDB)?
Dann hab ich nämlich einfach mal wieder um zuviele Ecken gedacht.

L
lucksn Themenstarter:in
34 Beiträge seit 2008
vor 16 Jahren

So ich habe die Aufgabe doch etwas falsch verstanden, hätte ich aber auch selber merken müssen.
Die Daten sollen nicht üüberschrieben werden sondern bei Klick auf Pause eine neue Zeile erstellt werden (INSERT INTO) und habs hinbekommen.
Dann soll die apssende Endzeit dazu gesetzt werden (mit UPDATE) allerdings nur für dieses eine Feld.
Nicht für alle EndzeitFelder sondenr nur für das was der aktuellen zeit dann zugeordnet is, da haenge ich nun dran.

476 Beiträge seit 2004
vor 16 Jahren

hallo lucksn,

manchmal muss man die Probleme eben schon an der Wurzel (die richtige Aufgabenstellung) packen 😄.

Du hängst jetzt also daran dass du beim UPDATE die passende Startzeit benötigst, um bei diesem Datensatz die Endzeit einzutragen. Da gibt es verschiedene Möglichkeiten, zum einen musst du entweder den ID/Startzeit/sonstigen eindeutigen Stichpunkt für deinen Datensatz ermitteln und diesen dann in der WHERE-Klausel deiner UPDATE-Anweisung verwenden.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

Gelöschter Account
vor 16 Jahren

nur am rande möchte ich erwähnen das die art und weise wie du deine sql-statements zusammenbaust ein offenes tor für sql-injection ist.
hier sollte man prinzipiell parameter verwenden.

1.433 Beiträge seit 2006
vor 16 Jahren

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

L
lucksn Themenstarter:in
34 Beiträge seit 2008
vor 16 Jahren

Hallo leue,

ersteinmal Danke für eure Hilfe.
Da ich es mit Problembeschreibungen nicht unbedingt so gut meine (ich kann es einfach nicht) haben wir hier ein völlig falsches Problem gelöst.
Es wurden natürlich nun ständig die Zeiten überschrieben was nicht Sinn der Sache war, ich habs nun aber gelöst.
Beim Klick auf Button A wird ein neuer Datensatz erstellt, Button B updated diesen dann indem er sich vorher die ID zieht, sowie die Zeiten vergleicht.

Zum Thema SQL-Injection, danke für den Hinweis, jedoch werden diese Daten hier, nur lokal gespeichert.
Ich wüsste nun nicht wie ein Angreifer damit was anfangen sollte.
Dennoch herzlichen Dank für den Hinweis, und vor allem an schaedld für den Link, da ich auf Anhieb nicht wusste was das ist.

Ich fange an diesem Forum mein "Leben" zu verdanken 🤔.
Stefan.

J
3.331 Beiträge seit 2006
vor 16 Jahren

Zum Thema SQL-Injection, danke für den Hinweis, jedoch werden diese Daten hier, nur lokal gespeichert.
Ich wüsste nun nicht wie ein Angreifer damit was anfangen sollte.

Auch dann solltest Du von Anfang an mit DbCommand.Parameters arbeiten und nicht die Werte in eine lange String-Verknüpfung einbauen. Das vermeidet unnötige, doppelte und fehleranfällige Konvertierungen vor allem bei Datumsangaben, aber auch bei Zahlen und bool-Werten. Jürgen