【问题标题】:ExecuteNonQuery() SQLException Incorrect Syntax Near ',' WPF [closed]ExecuteNonQuery() SQLException Incorrect Syntax Near ',' WPF [关闭]
【发布时间】:2017-08-22 15:41:53
【问题描述】:

我正在尝试运行一个 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 查询,所以我对此很陌生。任何帮助将不胜感激:)

【问题讨论】:

  • 尝试使用参数而不是使用变量创建插入命令。
  • 旁注:一次性物品使用using
  • DeductionInfo 表中列的实际名称是什么?这些不是动态的......
  • 您应该阅读有关 SQL 注入的信息:stackoverflow.com/questions/7505808/…
  • 感谢您的回复。我的列的实际名称是“Check_No”和“Check_Date”,它们是在一个名为“DataProperties”的单独类中定义的,因此我对 checkNoValue 和 checkDateValue 进行了转换。

标签: c# sql wpf ado.net radgridview


【解决方案1】:

在执行动态 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");
}

【讨论】:

  • 谢谢。你对这个问题给出了非常明确的答案。就像我说的,在处理数据库和 SQL 查询时,我对它很陌生。即使在发布这个问题之前我做了所有的研究,我也没有接触到参数的概念。这肯定很有意义。我会告诉你它是否有效。
  • 这摆脱了我最初的错误。现在它说'参数化查询'(@checkNoValue nvarchar(4),@checkDateValue nvarchar(4000))插入'需要参数'@checkDateValue',但未提供'。我不完全确定它在说什么......
  • 确保您的 checkDateValue 变量包含一个值。
  • 确实如此,虽然它是一个 DateTime 值,所以我不确定这是否会影响任何事情。 DataProperties 中的属性是 DateTime,数据库中数据表中的列也是 datetime。
【解决方案2】:

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

【讨论】:

  • 感谢回复,我试试看。我对这个问题进行了大量研究,但从未有人提出使用参数的想法。很有帮助。
  • 还要确保在 c# 代码中添加参数的顺序与它们在查询中出现的顺序相同。这让我过去很头疼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多