verwendetes Datenbanksystem: SQL Server Express
Hallo zusammen,
ich bekomme bei einem Update-Statement immer eine Fehlermeldung "Falsche Syntax in der Nähe von '='".
Hier ist der Code-Schnipsel:
System.Data.SqlClient.SqlConnection con;
con = new System.Data.SqlClient.SqlConnection();
con.ConnectionString = ConfigurationManager.AppSettings.Get("SpielDaten").ToString();
con.Open();
sql = "UDPATE Mandant ";
sql += "SET mandant_name=@vMandantName,";
sql += "datenpfad=@vDatenPfad,";
if (this.checkBox1.Checked)
{
sql += "auswertung_jn=1 ";
}
else
{
sql += "auswertung_jn=0 ";
}
sql += "WHERE mandant_id=" + this.getMandantId().ToString();
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.AddWithValue("@vMandantName",this.textBox1.Text);
cmd.Parameters.AddWithValue("@vDatenPfad",this.textBox2.Text);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("Fehler: " + ex.ToString() + "\nSQL: " + sql);
}
finally
{
// alles aufräumen
cmd.Dispose();
}
Keine Ahnung, was ich hier falsch mache...
Ich bin für jeden Tipp dankbar.
Gruß,
thion007
verwendetes Datenbanksystem: SQL Server Express
sql += "WHERE mandant_id=" + this.getMandantId().ToString(); SqlCommand cmd = new SqlCommand(sql, con); cmd.Parameters.AddWithValue("@vMandantName",this.textBox1.Text); cmd.Parameters.AddWithValue("@vDatenPfad",this.textBox2.Text);
Ich mutmaße mal dass entweder getMandantId() kein Ergebnis liefert
oder eine der Textboxen...
Evtl solltest Du dir [Artikelserie] SQL: Parameter von Befehlen nochmal genauer anschauen.
Das halbherzig umzusetzen ist schlecht.
Hallo,
ich schätze deine ID gehört in Hochkommas:
sql += "WHERE mandant_id=" + "'" + this.getMandantId().ToString() + "'";
Das sollte man so überhaupt nicht tun!
Siehe Hinweis von FZelle auf [Artikelserie] SQL: Parameter von Befehlen
Hi Azteko,
Ich mutmaße mal dass entweder getMandantId() kein Ergebnis liefert
oder eine der Textboxen...
das war auch mein erster Ansatz, ist leider nicht der Fall...
Gruß,
thion007
Wo der Fehler liegt, kann man wahrscheinlich am besten direkt im fertigen SQL-String sehen.
Hallo chilic,
Wie sieht das SQL aus?
UDPATE Mandant SET mandant_name='Test',datenpfad='test',auswertung_jn=0 WHERE mandant_id=7
Ich kann da beim besten Willen nix Falsches sehen...
Um den SQL-String inkl. der Parameterwerte zu erhalten, habe ich meinen Code angepasst:
sql += "SET mandant_name='" + this.textBox1.Text + "',";
sql += "datenpfad='" + this.textBox2.Text + "',";
Der Fehler bleibt auch hier...
Gruß,
thion007
Hallo thion007,
du solltest unbedingt die Hinweise beachten, die dir gegeben werden. Sonst bringt das nichts. Schau dir also (endlich) [Artikelserie] SQL: Parameter von Befehlen an, dann wird der Fehler auch verschwinden.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Hallo,
ich habe jetzt die Parametrisierung komplett eingebaut:
StringBuilder vSql = new StringBuilder();
vSql.AppendLine("UDPATE AFG_Mandant ");
vSql.AppendLine("SET mandant_name=@vMandantName,");
vSql.AppendLine("datenpfad=@vDatenPfad,");
vSql.AppendLine("auswertung_jn=@vAuswertung ");
vSql.AppendLine("WHERE mandant_id=@vMandantId");
SqlCommand cmd = new SqlCommand(vSql.ToString(), con);
cmd.Parameters.AddWithValue("@vMandantName",this.textBox1.Text);
cmd.Parameters.AddWithValue("@vDatenPfad",this.textBox2.Text);
cmd.Parameters.AddWithValue("@vMandantId", this.getMandantId().ToString());
if (this.checkBox1.Checked)
{
cmd.Parameters.AddWithValue("@vAuswertung", 1);
}
else
{
cmd.Parameters.AddWithValue("@vAuswertung", 0);
}
Leider gibt auch das keine Änderung, der Fehler bleibt bestehen.
Wenn ich das SQL per Hand auf die Datenbank "loslasse", klappt's einwandfrei.
Gruß,
thion007
Hallo
Was ist denn "mandant_id" für ein Typ? Du übergibts hier einen String, ich schätze aber, das Feld ist ein Integer?
Das "if" bei der CheckBox kannst Du dir auch sparen
cmd.Parameters.AddWithValue("@vAuswertung", this.checkBox1.Checked);
mfG Thomas
Vedrsuche doch mal die Feldbezeichnungen in eckige Klammern zu setzten.
z.B.
vSql.AppendLine("UDPATE AFG_Mandant ");
vSql.AppendLine("SET [mandant_name]=@vMandantName,");
vSql.AppendLine("[datenpfad]=@vDatenPfad,");
vSql.AppendLine("[auswertung_jn]=@vAuswertung ");
vSql.AppendLine("WHERE [mandant_id]=@vMandantId");
Ich hatte auch schon mehrfach dieses Problem.
Das kommt evtl. daher, daß ein Feldname einer in der Datenbank intern verwendeten Methode, Variable oder Konstante entspricht.
Wenn die SQL-Anweisung direkt in der DB abgesetzt wird, wird so etwas von der DB erkannt und entsprechend behandelt.
Wenn Du aber aus einem Programm über einen DB-Provider arbeitest, müßte der DB-Provider das erkennen und behandelt. Tut er aber meistens nicht.
Wenn Du die Feldnamen in [] setzt, dann ist das für die DB eindeutig als Feldnamen
zu erkennen.
Ich habe da den Feldnamen 'Datenpfad' im Verdacht. Aber das kannst Du ja selbst ausprobieren
Hallo san-software,
das habe ich gemacht, jetzt änderte sich der Fehler dahingehend, dass die Fehlermeldung jetzt lautet "Falsche Syntax in der Nähe von [mandant_name]".
Irgendwann habe ich dann die erste Zeile ("UPDATE...") komplett gelöscht und per Hand neu eingetippert und...nun klappts! Also vermutlich irgendein nicht druckbares Zeichen, etc.
Das Problem hat sich erledigt, danke für Eure Hilfe!!!!
Gruß,
thion007
Hast ja auch UDPATE geschrieben 😃