首页 > 解决方案 > 更新查询 C# SQL Server

问题描述

单击 EditAll 按钮时会引发异常。

private void editAll_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\DELL\source\repos\phoneBookwin\phoneBookwin\Database1.mdf;Integrated Security=True");
            con.Open();

            string value;
            bool friendCheck = newFriends.Checked;
            bool familyCheck = newFamily.Checked;
            bool emergencyCheck = newEmergency.Checked;
            bool collCheck = newColl.Checked;
            if (friendCheck)
                value = newFriends.Text;
            else if (familyCheck)
                value = newFamily.Text;
            else if (emergencyCheck)
                value = newEmergency.Text;
            else if (collCheck)
                value = newColl.Text;
            else
                value = "";
            SqlCommand cmd = new SqlCommand("update Contacts set Name='"+newName.Text+"' Contacts='"+newNumber.Text+"' Email='"+newEmail.Text+"' Group='"+value+"' where Name='"+changeName.Text+"')", con);
            cmd.ExecuteNonQuery();
            this.Hide();
            Form1 save = new Form1();
            save.ShowDialog();
            con.Close();
        }

抛出的异常是

联系人附近的语法不正确

标签: c#sql-server

解决方案


但是,您的 SQL 看起来无效;这可能是件好事,因为现在这是一个巨大的安全漏洞——你必须在 SQL 中使用参数,否则你的字符串连接方法会遇到问题,包括:

  • 安全性,请参阅“SQL 注入”
  • 正确性,请参见“Peter O'Toole”之类的名称
  • 正确性,在不同的客户端区域设置格式(尤其是日期和数字)
  • 服务器性能(查询计划缓存)

参数代码很乏味,但像“Dapper”这样的工具让它变得轻松:


// see "using" here - we need to Dispose connections!
using var con = new SqlConnection(...);
// ...
// (the following is an extension method added by Dapper)
con.Execute(@"
update Contacts
set    Name = @newName, Contacts = @newNumber,
       Email = @newEmail, Group = @newGroup
where  Name = @changeName", new {
    newName = newName.Text,
    newNumber = newNumber.Text,
    newEmail = newEmail.Text,
    newGroup = value,
    changeName = changeName.Text
});

另请注意,名称不是唯一的,不应(单独)用作谓词。


推荐阅读