Laden...

DataSet in Datenbank schreiben klappt nicht

Letzter Beitrag vor 18 Jahren 10 Posts 5.287 Views
DataSet in Datenbank schreiben klappt nicht

Hi ihr,
ich tüftel hier seit ner Weile an nem Problem.
Und zwar wird mein DataSet, was ich auslese und dem
ich anschließend eine Zeile hinzufüge, nicht in
die Datenbank geschrieben.
Ich bin erst Anfänger, geb ich zu, aber nach
den Tutorials und der MSDN Libary bin ich der Meinung
das mein Code richtig ist.


1 Database1DataSet.TestTableRow blubrow = database1DataSet1.TestTable.NewTestTableRow();
2 blubrow.TestWert1 = "wah";
3 blubrow.TestWert2 = "ney";
4 database1DataSet1.TestTable.AddTestTableRow(blubrow);
5 database1DataSet1.AcceptChanges();
6 int result = testTableTableAdapter.Update(database1DataSet1.TestTable);

Result lasse ich ausgeben und es wird richtig 1 angezeigt,
da eine Änderung vorgenommen wurde.

Ich habe es mit und ohne Zeile 5 versucht, beidemale keine Veränderung
der Datenbank. Einzige unterschied war, das result MIT zeile 5, 0 zurückgibt.

Könnt ihr mir da weiter helfen?

Max

Beim Aufrufen von AcceptChanges wird die EndEdit-Methode implizit aufgerufen, um sämtliche Bearbeitungsvorgänge zu beenden. Wenn der RowState der Zeile Added oder Modified war, erhält den Wert Unchanged. Wenn der RowState den Wert Deleted hatte, wird die Zeile entfernt.

Das steht in der Hilfe. Das heißt die Update-Methode des DataAdapter geht für jede Zeile durch und überprüft den RowState und führt dann die entsprechende Anweisung aus. Wird AcceptChanges vorher aufgerufen werden alle Neuerungen z.B. gelöscht bzw. als schon registriert vermerkt. Der DataAdapter führt keine Update-Methode durch. Übrigens DataAdapter.Update() ruft automatisch danach AcceptChanges auf.

So. Jetzt zu Punkt 1 zurück warum wird nichts in die DB geschrieben wenn Zeile 5 fehlt. Theoretisch müsste es passieren. Zeig mal die Update-SQL-Anweisung des DataAdapters.

PS: Ich sehe in deinem Code nicht, ob du die Connection öffnest oder nicht. Ich gehe aber davon aus das du das machst. Am besten immer in der Form:

Connection.Open();
try
{
 DataAdapter.Update();
}
except()
{ //Fehlerbehandlung
}
finally
{
Connection.Close()
}


So. Jetzt zu Punkt 1 zurück warum wird nichts in die DB geschrieben wenn Zeile 5 fehlt. Theoretisch müsste es passieren. Zeig mal die Update-SQL-Anweisung des DataAdapters.

Hoffe das ist der Teil den du meinst.
Nach meinen SQL Kentnissen sollte das Funktionieren.

UPDATE [dbo].[TestTable] SET [TestWert1] = @TestWert1, [TestWert2] = @TestWert2 WHERE (([TestID] = @Original_TestID) AND ([TestWert1] = @Original_TestWert1) AND ([TestWert2] = @Original_TestWert2));
SELECT TestID, TestWert1, TestWert2 FROM TestTable WHERE (TestID = @TestID)

PS: Ich sehe in deinem Code nicht, ob du die Connection öffnest oder nicht. Ich gehe aber davon aus das du das machst. Am besten immer in der Form:

Die Connection wird nich explizit aufgerufen von mir.
Da ich aber Daten aus der DB lesen kann, scheint dies implizit zu funktionieren.

(Hab den Adapter und das DataSet per Drag&Drop erzeugt)

Achso, noch was nachgeschoben:
Ich hatte auch mal ein Beispiel geschafft, in dem ich den Datenbestand
der Datenbank ändern konnte. Hat sich so geäußert, das bei erneutem
Debugstart die Daten richtig ausgelesen wurden.
Sobald ich aber Rechtsklick auf die Tabelle und dann Show Data Table mache,
stehen nach wievor die von handeingetragenen Daten in der Tabelle.
Nach erneutem Programmstart sind die vorher hinzugefügten Daten
wieder weg, und der Datenbestand wie beim 1. Programm start.

Hoffe alles war verständlich und hilft.

Max

ich würd den ganzen datenbank-zugriffskram von hand erstellen ...
erstens lernst du dabei wie´s gemacht wird (so hab ichs jedenfalls gelernt 😉 ) ...
zweitens hast du mehr überblick über deine funktionen ...

hier nen beispiel wie ich immer vorgehe (ist ne separate klasse auf die du von überall aus deinem programm zugreifen kannst):


        public class dbzugriff
        {
            public static MySqlConnection myConnection = new MySqlConnection();
            public static string status = myConnection.State.ToString();

            public static string CNstring = "Persist Security Info=False;database=deinedatenbank;server=deinserver;Connect Timeout=30;user id=benutzer; pwd=passwort";

            public static DataSet ds = new DataSet();

            public static MySqlDataAdapter da = new MySqlDataAdapter();

            public static void SELECT()
            {
                MySqlCommand cmdSELECT = new MySqlCommand();
                cmdSELECT.CommandText = "SELECT * FROM deinetabelle where name=?name";
                cmdSELECT.Parameters.Add("@name", MySqlDbType.VarChar).Value = "deinwert";

                cmdSELECT.Connection = dbzugriff.myConnection;

                da.SelectCommand = cmdSELECT;
                try { da.Fill(ds, "tabelle"); }
                catch { MessageBox.Show("Es konnte keine Verbindung zum MySQL-Server hergestellt werden.\nÜberprüfen Sie ob der Server korrekt läuft.", "keine Verbindung", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); }
            }

            public static void INSERT()
            {
                MySqlCommand cmdINSERT = new MySqlCommand();
                cmdINSERT.CommandText = "INSERT INTO deinetabelle VALUES ('deinwert');";

                cmdINSERT.Connection = dbzugriff.myConnection;

                da.InsertCommand = cmdINSERT;
                cmdINSERT.ExecuteNonQuery();
                ds.Clear();
            }

            public static void UPDATE()
            {
                MySqlCommand cmdUPDATE = new MySqlCommand();
                cmdUPDATE.CommandText = "UPDATE deinetabelle SET name='dein neuer wert' WHERE name='deinwert' ;";
                cmdUPDATE.Connection = Form1.dbzugriff.myConnection;

                da.UpdateCommand = cmdUPDATE;
                cmdUPDATE.ExecuteNonQuery();
            }

            public static void DELETE()
            {
                MySqlCommand cmdDELETE = new MySqlCommand();
                cmdDELETE.CommandText = "DELETE FROM deinetabelle WHERE name = 'deinwert';";

                cmdDELETE.Connection = Form1.dbzugriff.myConnection;

                da.DeleteCommand = cmdDELETE;
                cmdDELETE.ExecuteNonQuery();
            }

            public static void connect()
            {
                try
                {
                    myConnection.ConnectionString = CNstring;
                    myConnection.Open();
                }
                catch
                {
                }
            }

            public static void disconnect()
            {
                try
                {
                    myConnection.Close();
                }
                catch
                {
                }
            }
	}

diese klasse hat jeweils fürs SELECT, INSERT, UPDATE, DELETE, CONNECT & DISCONNECT ne separate funktion ...

ich hoff das bringt dich auf den weg ;o) ...
das beispiel ist für mySQL ... aber auch die anderen datenbanken lassen sich damit ansprechen ...

falls du nen connectionstring für ne andere datenbank brauchst ... schau da -->>ConnectionStrings

grüßle

frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)


mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb

Ok, werd das mal ausprobieren.
Hatte es schon mal per Hand gemacht gehabt.
Ging leider genausowenig. Vielleicht klappts ja
mit der Extra Klasse.

Danke soweit^^

bitte bitte 😉 ... keine ursache 😉 ...

bei mir funktioniert und arbeitetet diese klasse (natürlich jeweils angepasst) in 5 anwendungen ...

diese klasse soll dir ja als beispiel dienen ... in einer meiner anwendungen ist diese klasse etwa 500 zeilen lang ... ich hab da für jeden anwedungszweck zum beispiel separate selects ... hab mir dort auch backup- & recoveryfunktionen gebastelt ... zum sichern und wiederherstellen der datenbank ...
also lauter schicke sachen kann man mit der klasse machen 😉

grüßle

frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)


mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb

Ich komm nicht ganz klar, dass das alles static deklariert ist.
Hab mich aber an deinem sonstigen Code orientiert und einen
Update befehl erfolgreich hinbekommen. Werde also jetzt
alles per hand machen^^

Danke soweit😁

(auch wenn es das eigentliche Problem nicht
gelöst hat)

Max

ich hab das alles static deklariert ... damit ichs von überall in meiner anwendung aufrufen kann

beispiele für SELECT, INSERT, UPDATE, DELETE, connect & disconnect :

dbzugriff.SELECT();
dbzugriff.INSERT();
dbzugriff.UPDATE();
dbzugriff.DELETE();
dbzugriff.connect();
dbzugriff.disconnect();

dadurch greifst du immer auf die jeweilige funktion der klasse dbzugriff zu

hier nochmal zum besseren verständnis nen vollständiges beispiel:


#region Using directives

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Globalization;
using System.Threading;
using System.IO;
using System.Diagnostics;
using System.Text;
using System.Collections;
using MySql.Data.MySqlClient;
using System.Windows.Forms.VisualStyles;

#endregion

namespace Database
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class dbzugriff
        {
            public static MySqlConnection myConnection = new MySqlConnection();
            public static string status = myConnection.State.ToString();

            public static string CNstring = "Persist Security Info=False;database=deinedatenbank;server=deinserver;Connect Timeout=30;user id=benutzer; pwd=passwort";

            public static DataSet ds = new DataSet();

            public static MySqlDataAdapter da = new MySqlDataAdapter();

            public static void SELECT()
            {
                MySqlCommand cmdSELECT = new MySqlCommand();
                cmdSELECT.CommandText = "SELECT * FROM deinetabelle where name=?name";
                cmdSELECT.Parameters.Add("@name", MySqlDbType.VarChar).Value = "deinwert";

                cmdSELECT.Connection = dbzugriff.myConnection;

                da.SelectCommand = cmdSELECT;
                try { da.Fill(ds, "tabelle"); }
                catch { MessageBox.Show("Es konnte keine Verbindung zum MySQL-Server hergestellt werden.nÜberprüfen Sie ob der Server korrekt läuft.", "keine Verbindung", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); }
            }

            public static void INSERT()
            {
                MySqlCommand cmdINSERT = new MySqlCommand();
                cmdINSERT.CommandText = "INSERT INTO deinetabelle VALUES ('deinwert');";

                cmdINSERT.Connection = dbzugriff.myConnection;

                da.InsertCommand = cmdINSERT;
                cmdINSERT.ExecuteNonQuery();
                ds.Clear();
            }

            public static void UPDATE()
            {
                MySqlCommand cmdUPDATE = new MySqlCommand();
                cmdUPDATE.CommandText = "UPDATE deinetabelle SET name='dein neuer wert' WHERE name='deinwert' ;";
                cmdUPDATE.Connection = Form1.dbzugriff.myConnection;

                da.UpdateCommand = cmdUPDATE;
                cmdUPDATE.ExecuteNonQuery();
            }

            public static void DELETE()
            {
                MySqlCommand cmdDELETE = new MySqlCommand();
                cmdDELETE.CommandText = "DELETE FROM deinetabelle WHERE name = 'deinwert';";

                cmdDELETE.Connection = Form1.dbzugriff.myConnection;

                da.DeleteCommand = cmdDELETE;
                cmdDELETE.ExecuteNonQuery();
            }

            public static void connect()
            {
                try
                {
                    myConnection.ConnectionString = CNstring;
                    myConnection.Open();
                }
                catch
                {
                }
            }

            public static void disconnect()
            {
                try
                {
                    myConnection.Close();
                }
                catch
                {
                }
            }
        }         

        private void button1_Click(object sender, EventArgs e)
        {
            dbzugriff.ds.Clear();   //bereinigt das DataSet
            dbzugriff.connect();   // connectet zur Datenbank
            dbzugriff.SELECT();   //führt SELECT-Befehl aus
            dbzugriff.INSERT();   //führt INSERT-Befehl aus
            dbzugriff.UPDATE();   //führt UPDATE-Befehl aus
            dbzugriff.DELETE();   //führt DELETE-Befehl aus
            dbzugriff.disconnect();   //trennt die Verbindung
            // natürlich mußt du nur die Befehle ausführen die du brauchst, 
            // alles andere ist hier nur nen Beispiel
        }
    }
}

erst bei private void button1_Click(object sender, EventArgs e) wird auf die funktionen der klasse dbzugriff zugegriffen.

grüßle

frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)


mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb

Soweit verständlich. Also wann was wie aufgerufen wird.

Scheinbar hab ich das static-Konzept noch nicht richtig verstanden.

Wenn du bsp. dbzugriff.SELECT() aufrufst, wo werden die Daten
gespeichert? Da kein Objekt erzeugt wurde, ist mir absolut schleierhaft
wie die daten dann im DataSet abgelegt werden ?(

Verstehst wie ich das mein?

das dataset wird in der klasse erstellt 😉 ...

-->> public static DataSet ds = new DataSet();

grüßle

(hast übrigends ne PM 😉 )

frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)


mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb