Laden...

[erledigt] Falsche Syntax in der Nähe von '='

Erstellt von thion007 vor 11 Jahren Letzter Beitrag vor 11 Jahren 21.291 Views
T
thion007 Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren
[erledigt] Falsche Syntax in der Nähe von '='

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

A
3 Beiträge seit 2012
vor 11 Jahren

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...

F
10.010 Beiträge seit 2004
vor 11 Jahren

Evtl solltest Du dir [Artikelserie] SQL: Parameter von Befehlen nochmal genauer anschauen.

Das halbherzig umzusetzen ist schlecht.

C
2.121 Beiträge seit 2010
vor 11 Jahren

Wie sieht das SQL aus?

S
322 Beiträge seit 2007
vor 11 Jahren

Hallo,

ich schätze deine ID gehört in Hochkommas:


sql += "WHERE mandant_id=" + "'" + this.getMandantId().ToString() + "'";

Hinweis von Abt vor 11 Jahren

Das sollte man so überhaupt nicht tun!
Siehe Hinweis von FZelle auf [Artikelserie] SQL: Parameter von Befehlen

T
thion007 Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

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

A
764 Beiträge seit 2007
vor 11 Jahren

Wo der Fehler liegt, kann man wahrscheinlich am besten direkt im fertigen SQL-String sehen.

T
thion007 Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

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

6.911 Beiträge seit 2009
vor 11 Jahren

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!"

T
thion007 Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

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

T
111 Beiträge seit 2005
vor 11 Jahren

Hallo

  1. Was ist denn "mandant_id" für ein Typ? Du übergibts hier einen String, ich schätze aber, das Feld ist ein Integer?

  2. Das "if" bei der CheckBox kannst Du dir auch sparen



cmd.Parameters.AddWithValue("@vAuswertung", this.checkBox1.Checked);


mfG Thomas

S
93 Beiträge seit 2008
vor 11 Jahren

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

T
thion007 Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

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

A
764 Beiträge seit 2007
vor 11 Jahren

Hast ja auch UDPATE geschrieben 😃