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.
BizTalk Open Space: http://biztalkopenspace.de/2010/
DNUG Chemnitz: http://dotnet-chemnitz.de
Blog: http://sqlpractice.wordpress.com
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...
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.
BizTalk Open Space: http://biztalkopenspace.de/2010/
DNUG Chemnitz: http://dotnet-chemnitz.de
Blog: http://sqlpractice.wordpress.com
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)
Ok, ich lern hier ne Menge dazu 🙂 Irgendwann hab ich den perfekten Code aber dennoch keine Lösung g Ist ne böse gemeint 😉
BizTalk Open Space: http://biztalkopenspace.de/2010/
DNUG Chemnitz: http://dotnet-chemnitz.de
Blog: http://sqlpractice.wordpress.com
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
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)
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?
BizTalk Open Space: http://biztalkopenspace.de/2010/
DNUG Chemnitz: http://dotnet-chemnitz.de
Blog: http://sqlpractice.wordpress.com
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
Ok der Fehler ist gefunden, vielen Dank LastGentlemen, genau daran lags. Hab sie beim neu kompilieren jedes mal überschrieben 🙂 Dumm gelaufen g
BizTalk Open Space: http://biztalkopenspace.de/2010/
DNUG Chemnitz: http://dotnet-chemnitz.de
Blog: http://sqlpractice.wordpress.com