ExecuteNonQuery() SQLException 不正确的语法靠近 ',' WPF

ExecuteNonQuery() SQLException Incorrect Syntax Near ',' WPF

我正在尝试 运行 SQL 命令将列中的所有项目保存回数据库 table。用户输入此信息,当他们关闭 window 时,新输入的信息应保存回数据库。我正在尝试使用 SQL 连接和 SQL 命令来执行此操作。问题是当我输入信息并关闭 window 时,我在 comm.ExecuteNonQuery() 处收到一条错误消息,显示 'Incorrect syntax near ','.'考虑到我在在线 SQL 语法检查器中输入语法并且一切正常,我不确定命令中的确切位置存在问题。下面是我的 Window_Closing 事件代码:

public void Window_Closing(object sender, CancelEventArgs e)
    {
        var checkNoValue = ((DataProperties)gridView.SelectedItem).Check_No;
        var checkDateValue = ((DataProperties)gridView.SelectedItem).Check_Date;

        SqlConnection conn;
        SqlCommand comm;
        string connstring = "server = testserver; database = test; user = someusername; password = somepassword";
        conn = new SqlConnection(connstring);
        conn.Open();
        comm = new SqlCommand("insert into DeductionInfo (" + gridView.Columns["checkNo"] + ", " + gridView.Columns["checkDate"] + ") values (" + checkNoValue + ", " + checkDateValue + ")", conn);

        comm.ExecuteNonQuery();
        MessageBox.Show("Saved");
    }

我正在尝试将新数据插入到位于我的数据库中的 DeductionInfo 数据中table。我想我可以猜出问题是什么,因为我将 checkNoValuecheckDateValue 设置为我的 gridView.SelectedItem 属性,但是我不确定如何设置它这些特定列中的每个值(顺便说一下,我正在使用 Telerik 的 RadGridView)。请记住,Check_No 是一个整数,Check_Date 是一个日期时间。我是在处理这一切错误还是在正确的轨道上?这是我第一次在 WPF 和 C# 中处理 SQL 查询,所以我对此很陌生。任何帮助将不胜感激:)

这是在连接结束时处理连接的正确方法,以及如何将参数传递给 SQL 查询。这将避免您现在遇到的错误,并保护您免受 SQL 注入

string sql = "SELECT empSalary from employee where salary = @salary";

using (SqlConnection connection = new SqlConnection(/* connection info */))
using (SqlCommand command = new SqlCommand(sql, connection))
{
    var salaryParam = new SqlParameter("salary", SqlDbType.Money);
    salaryParam.Value = txtMoney.Text;

    command.Parameters.Add(salaryParam);
    var results = command.ExecuteReader();
}

来源:Why do we always prefer using parameters in SQL statements?

执行动态 SQL 查询时应始终使用参数,并且在使用完后应始终处置 IDisposables

此外,数据库中 table 的列名不是动态的。您需要知道它们的实际名称才能向其中插入一些数据。

试试这个:

public void Window_Closing(object sender, CancelEventArgs e)
{
    var checkNoValue = ((DataProperties)gridView.SelectedItem).Check_No;
    var checkDateValue = ((DataProperties)gridView.SelectedItem).Check_Date;

    SqlConnection conn;
    SqlCommand comm;
    string connstring = "Server = testserver; Database = test; User Id = test; Password = somepassword;"
            conn = new SqlConnection(connstring);
    conn.Open();
    comm = new SqlCommand("insert into DeductionInfo (checkNo, checkDate) values (@checkNoValue, @checkDateValue)", conn);
    comm.Parameters.AddWithValue("@checkNoValue", checkNoValue);
    comm.Parameters.AddWithValue("@checkDateValue", checkDateValue);

    comm.ExecuteNonQuery();
    comm.Dispose();
    conn.Dispose();

    MessageBox.Show("Saved");
}