【问题标题】:Error with SQL commandSQL 命令出错
【发布时间】:2014-01-16 05:35:34
【问题描述】:

我正在尝试将表单中文本框中的用户详细信息获取到我的数据库以供访问,这应该会保存。但是,每次单击注册时我都会收到一条错误消息,以下代码是我尝试将其写出的方式:

public void AddNewUser()
{
    string filePath;
    try
    {
        filePath = (Application.StartupPath + ("\\" + DBFile));
        connection = new System.Data.OleDb.OleDbConnection((ConnectionString + filePath));
        connection.Open();
        System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand();
        command.Connection = connection;
        // ---set the user's particulars in the table---
        string sql = ("UPDATE enroll SET SSN=\'"
                    + (txtSSN.Text + ("\', " + ("Name=\'"
                    + (txtName.Text + ("\', " + ("Company=\'"
                    + (txtCompany.Text +("\', "
                    + (" WHERE ID=" + _UserID))))))))));
        command.CommandText = sql;
        command.ExecuteNonQuery();
        MessageBox.Show("User added successfully!", "Error");

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString(), "Error");
    }
    finally
    {
        connection.Close();
    }
}

但我认为问题实际上来自这一部分:

// ---set the user's particulars in the table---
string sql = ("UPDATE enroll SET SSN=\'"
            + (txtSSN.Text + ("\', " + ("Name=\'"
            + (txtName.Text + ("\', " + ("Company=\'"
            + (txtCompany.Text +("\', "
            + (" WHERE ID=" + _UserID))))))))));
command.CommandText = sql;
command.ExecuteNonQuery();
MessageBox.Show("User added successfully!", "Error");

【问题讨论】:

  • 什么样的错误信息?
  • 无效的 SQL 语句。去掉逗号+ (txtCompany.Text +("\' "
  • @Vland 会弹出一个消息框:“System.DataOleDbException: Syntax error in UPDATE Statement... etc etc”
  • 所有括号是怎么回事?
  • 正如 J Lo 所说...删除逗号。下次也显示错误,不仅是你的代码

标签: sql database visual-studio visual-studio-2012


【解决方案1】:

您的查询确实不可读。任何类型的错误都可能隐藏在字符串连接的丛林中,并且单引号无处不在。 (就像一个不必要的逗号可能从复制/粘贴操作的修复中逃脱)

你应该使用参数化查询,这一切都会消失

command.Connection = connection;
string sql = "UPDATE enroll SET SSN=?, Name=?, Company=? WHERE ID=?";
command.CommandText = sql;
command.Parameters.AddWithValue("@p1", txtSSN.Text);
command.Parameters.AddWithValue("@p2", txtName.Text );
command.Parameters.AddWithValue("@p3", txtCompany.Text);
command.Parameters.AddWithValue("@p4", _UserID);
command.ExecuteNonQuery();

现在我认为这确实更具可读性,无需添加引号,因为框架知道每个参数的数据类型,并将使用所需的适当引用。最后但同样重要的是,Sql Injection 没有问题

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 2021-03-02
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多