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

时间:2017-08-22 15:41:54

标签: c# sql wpf ado.net radgridview

我正在尝试运行一个SQL命令,将列中的所有项目保存回数据库表。用户输入此信息,当他们关闭窗口时,新输入的信息应保存回数据库。我试图使用SQL连接和SQL命令执行此操作。问题是,当我输入信息并关闭窗口时,我在comm.ExecuteNonQuery()处收到错误,上面写着“语法不正确”,“。”考虑到我在一个在线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数据表中。我想我可以猜测问题是什么,因为我将checkNoValuecheckDateValue设置为我的gridView.SelectedItem属性,但我不确定如何将其设置为这些属性中的每个值特定列(我顺便使用Telerik的RadGridView)。请注意,Check_No是一个整数,Check_Date是一个日期时间。我是在解决这个问题,还是我在正确的轨道上?这是我第一次在WPF和C#中处理SQL查询,所以我对此很新。任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:2)

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

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

试试这个:

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");
}

答案 1 :(得分:1)

这是在您的连接结束时处理连接的正确方法,以及如何将参数传递给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?