C#更新MariaDB数据库时出现SQL语法错误,求解决方案
咱们先看你遇到的报错内容:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near "test WHERE Gebr_id = 1' at line 1
这个错误的根源非常明确——你的SQL语句里**Telenummer字段的赋值没有闭合单引号**。来看看你写的代码片段:
string updateQuery = "UPDATE gebruikers SET Naam='" + txtNaam.Text + "', Voornaam='" + txtVoornaam.Text + "', Geboortedatum='" + txtGeboortedatum.Text + "', Email='" + txtEmail.Text + "', Gebruikernaam='" + txtGebruikersnaam.Text + "', Wachtwoord='" + txtWachtwoord.Text + "', Straat='" + txtStraat.Text + "', Huisbus='" + txtHuisbus.Text + "', Postcode='" + txtPostcode.Text + "', Plaats='" + txtPlaats.Text + "', Telenummer='" + txtTelefoonnummer.Text +" WHERE Gebr_id = " + int.Parse(txtID.Text);
注意最后一个字段Telenummer的部分:Telenummer='" + txtTelefoonnummer.Text +" WHERE...,这里在txtTelefoonnummer.Text后面直接接了WHERE,却没加闭合的单引号,导致数据库无法正确解析SQL的结构,自然抛出语法错误。
第一步:先修复语法错误
把缺失的单引号补上就行,修正后的代码片段如下:
string updateQuery = "UPDATE gebruikers SET Naam='" + txtNaam.Text + "', Voornaam='" + txtVoornaam.Text + "', Geboortedatum='" + txtGeboortedatum.Text + "', Email='" + txtEmail.Text + "', Gebruikernaam='" + txtGebruikersnaam.Text + "', Wachtwoord='" + txtWachtwoord.Text + "', Straat='" + txtStraat.Text + "', Huisbus='" + txtHuisbus.Text + "', Postcode='" + txtPostcode.Text + "', Plaats='" + txtPlaats.Text + "', Telenummer='" + txtTelefoonnummer.Text + "' WHERE Gebr_id = " + int.Parse(txtID.Text); executeMyQuery(updateQuery);
(重点看最后:txtTelefoonnummer.Text + "' WHERE,补上了之前缺失的单引号)
第二步:强烈建议改用参数化查询
虽然上面的修复能解决当前的语法问题,但字符串拼接SQL的写法存在严重的SQL注入风险——比如如果用户输入的内容里包含单引号(比如名字是O'Neil),你的SQL又会报错,甚至可能被恶意攻击者利用篡改数据库。
换成参数化查询的写法,既能彻底避免SQL注入,又能自动处理单引号这类语法细节,示例如下:
string updateQuery = @"UPDATE gebruikers SET Naam=@Naam, Voornaam=@Voornaam, Geboortedatum=@Geboortedatum, Email=@Email, Gebruikernaam=@Gebruikernaam, Wachtwoord=@Wachtwoord, Straat=@Straat, Huisbus=@Huisbus, Postcode=@Postcode, Plaats=@Plaats, Telenummer=@Telenummer WHERE Gebr_id = @Gebr_id"; // 假设你使用的是MariaDB官方驱动的连接对象 using(var cmd = new MySqlCommand(updateQuery, yourDatabaseConnection)) { cmd.Parameters.AddWithValue("@Naam", txtNaam.Text); cmd.Parameters.AddWithValue("@Voornaam", txtVoornaam.Text); cmd.Parameters.AddWithValue("@Geboortedatum", txtGeboortedatum.Text); cmd.Parameters.AddWithValue("@Email", txtEmail.Text); cmd.Parameters.AddWithValue("@Gebruikernaam", txtGebruikersnaam.Text); cmd.Parameters.AddWithValue("@Wachtwoord", txtWachtwoord.Text); cmd.Parameters.AddWithValue("@Straat", txtStraat.Text); cmd.Parameters.AddWithValue("@Huisbus", txtHuisbus.Text); cmd.Parameters.AddWithValue("@Postcode", txtPostcode.Text); cmd.Parameters.AddWithValue("@Plaats", txtPlaats.Text); cmd.Parameters.AddWithValue("@Telenummer", txtTelefoonnummer.Text); cmd.Parameters.AddWithValue("@Gebr_id", int.Parse(txtID.Text)); cmd.ExecuteNonQuery(); }
这种写法不仅更安全,后续维护和修改字段也会更方便,不用再手动处理字符串拼接的各种细节。
内容的提问来源于stack exchange,提问作者kyle vdk

