Laden...

[SQL CE] Insert wird ausgeführt, aber Datensatz fehlt.

Erstellt von roeb vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.261 Views
roeb Themenstarter:in
149 Beiträge seit 2006
vor 16 Jahren
[SQL CE] Insert wird ausgeführt, aber Datensatz fehlt.

verwendetes Datenbanksystem: SQL Server CE

Hallo,

ich hab mal wieder ein Problem wo ich leider durch die Suche auch nix gefunden habe und ich habe das gefühlt die Lösung ist so simple das ich sie einfach nur übersehe 🙂

Also folgendes Problem:
Ich habe eine Anwendung für Windows Mobile geschrieben wo nun ein Insert befehl ausgeführt werden soll. Der Befehl funktioniert auch und er speichert den Datensat auch während der Laufeit. Wenn ich das Programm beende und in die sdf schaue is der Datensatz plötzlich nicht mehr da oO

Hier mal mein Code:

Insert Funktion:

        private void btAddProject_Click(object sender, EventArgs e)
        {
            if (txtPrjLohn.Text != "" && txtPrjName.Text != "" && txtPrjLeader.Text != "" && cmbPrjStatus.Text != "")
            {
                bool status = false;
                status = clsConnection.SQL_QUERY("INSERT INTO tblProject VALUES ('" + Guid.NewGuid().ToString() + "','" + txtPrjName.Text + "','"
                                        + txtPrjLeader.Text + "','" + cmbPrjStatus.Text + "'," + txtPrjLohn.Text + ")");
                if (status == true)
                {
                    MessageBox.Show("Projekt erfolgreich hinzugefügt.");
                    this.Close();
                }
                else
                    MessageBox.Show("Bitte überprüfen Sie Ihre Angaben.", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
            }
            else
            {
                MessageBox.Show("Bitte überprüfen Sie Ihre Angaben.", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
            }
        }

Die Funktion in der Klasse für SqlCommand:

        public static bool SQL_QUERY(string SQLString)
        {
            try
            {
                cmd = new SqlCeCommand(SQLString, cn);
                cmd.ExecuteNonQuery();

                return true;
            }
            catch
            {
                return false;
            }
        }

Vielen Dank schonmal für eure Mühe 🙂

Gruß und ein erfolgreiches neues Jahr

Robert

edit:
Connection ist offen, falls sich jemand wundern sollte, wird gleich am Anfang bei Programm start geöffnet. Er schreibt es ja auch in die DB wärend der Laufeit, nur wenn ich das Programm beendet stehts nicht mehr drin.

S
8.746 Beiträge seit 2005
vor 16 Jahren

Kann leider keinen Fehler entdecken, aber du solltest nochmal an deiner Fehlerbehandlung arbeiten. Ein Catch zu machen um dann return false zu machen, dann ne Abfrage im Aufruf, etc. ist ganz schlimmer Code...

roeb Themenstarter:in
149 Beiträge seit 2006
vor 16 Jahren

okay, habs mal ein wenig abgeändert. Is sicher immernoch nicht die feine Art, aber doch etwas besser 🙂

         public static void SQL_QUERY(string SQLString)
        {
            try
            {
                if (cn.State == ConnectionState.Closed)
                    cn.Open();
                cmd = new SqlCeCommand(SQLString, cn);
                cmd.ExecuteNonQuery();
                cn.Close();

            }
            catch(SqlCeException ex)
            {
                throw new Exception(ex.Message);
            }
        }

Aufruf der Methode:

                try
                {
                    clsConnection.SQL_QUERY("NSERT INTO tblProject VALUES ('" + Guid.NewGuid().ToString() + "','" + txtPrjName.Text + "','"
                                            + txtPrjLeader.Text + "','" + cmbPrjStatus.Text + "'," + txtPrjLohn.Text + ")");
                    MessageBox.Show("Projekt erfolgreich hinzugefügt.");
                    this.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    this.Close();
                }

Hilft mir aber bei meinen eigentlichen Problem leider nicht viel weiter.

3.511 Beiträge seit 2005
vor 16 Jahren

Was jetzt vielleicht nicht zu deinem Problem hilfreich sein wird, aber verwende immer! SqlParameter (in diesem Falle hier SqlCeParameter). Man vermeidet dadurch Sql Injections und ist leserlicher und man hat keine Nebeneffekte bei z.B. Dezimalwerten (. und ,) und noch vieles mehr.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

roeb Themenstarter:in
149 Beiträge seit 2006
vor 16 Jahren

Ok, ich lern hier ne Menge dazu 🙂 Irgendwann hab ich den perfekten Code aber dennoch keine Lösung g Ist ne böse gemeint 😉

1.274 Beiträge seit 2005
vor 16 Jahren

Hi,

ich sehe hier gleich mehrer Probleme

1.

NSERT INTO tblProject VALUES

beim Insert fehlt das "I" am Anfang

2.

müssen nicht die Spalten im SQL angeführt werden, etwas so

INSERT INTO ADRESSEN ( Name, Land ) VALUES "LastGentleman", "A")

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

3.511 Beiträge seit 2005
vor 16 Jahren

müssen nicht die Spalten im SQL angeführt werden, etwas so

Nein muss nicht, wenn dieser Teil fehlt, dann werden alle Spalten erwartet. Wobei es stilistisch schöner ist, diese mit anzugeben (IMHO).

Edit: Verwendest du Transaktionen? (Kann SqlCe überhaupt Transaktionen?)

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

roeb Themenstarter:in
149 Beiträge seit 2006
vor 16 Jahren

oh das I fehlt mit absicht, wollte die exceptionbedhandlung testen 🙂 sry vergessen wieder zu ändern. der insert geht ja. nur wenn ichs programm beende stehts nicht mehr in der sdf file. Hatte es vielleicht was mit AddNew zu tun?

F
10.010 Beiträge seit 2004
vor 16 Jahren

Du schaust auch in dem richtigen SDF?

1.274 Beiträge seit 2005
vor 16 Jahren

Was mir mal passiert ist, ich hab die Datenbank bei jeden ausführen des Programmes überschrieben lassen und hab mich immer gewundert das nichts drinnen stand 😉.

Das ist eine Einstellung im VS.NET.

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

roeb Themenstarter:in
149 Beiträge seit 2006
vor 16 Jahren

Ok der Fehler ist gefunden, vielen Dank LastGentlemen, genau daran lags. Hab sie beim neu kompilieren jedes mal überschrieben 🙂 Dumm gelaufen g