使用预准备语句和占位符的MySQL插入命令不起作用

时间:2014-05-12 19:52:34

标签: c# mysql prepared-statement

我构建了一个MySql数据库和一个C#Windows GUI表单,其中包含文本框字段和一个时间选择器,用于填充名为' job'在我的数据库中。

我在本网站上阅读了一些关于使用预准备语句来防止sql注入攻击的重要性的帖子,我试图在我的代码中使用这个安全功能。 但它不起作用。我是网页设计师,但对编程很新。我在insert命令尝试了不同的代码变体仍然无法工作。我在这个表单上找到的样本涉及使用PHP编写的语句,这不是我正在使用的。

我收到以下错误消息:您的SQL语法中有错误;检查手册或MySQL服务器版本,以获得正确的语法,以便在“工作标题,this.dateTimePickerJobLastUpdated'”附近使用。在第1行

有谁知道我做错了什么以及如何解决这个问题?

这是该表的MySQL语句。

CREATE TABLE作业(

job_code VARCHAR(6) NOT NULL DEFAULT '',
job_title VARCHAR(30) NOT NULL DEFAULT '',  
    job_last_update DATE NOT NULL, 
    PRIMARY KEY (job_code)

)ENGINE = InnoDB CHARSET = utf8;

这是我的C#,用于将数据条目从Windows窗体保存到数据库的事件处理程序。

private void btnSaveJobsTable_Click(object sender,EventArgs e)         {

        String myConnection = @"server=localhost; database=beautyshopdb; username=$$$$; password=$$$$$$";
        MySqlConnection Connect = null;
        try
        {
            Connect = new MySqlConnection(myConnection);
            Connect.Open(); //open the connection
            //This is the mysql command that we will query into the db.
            //It uses Prepared statements and the Placeholder is @name.
            //Using prepared statements is faster and secure.
            String insertQuery = "INSERT INTO beautyshopdb(job) VALUES(@jobCode, @)jobTitle, @lastUpdated)";
            MySqlCommand cmdInsertJobsToDataBase = new MySqlCommand(insertQuery, Connect);
            cmdInsertJobsToDataBase.Prepare();
            //we will bound a value to the placeholder
            cmdInsertJobsToDataBase.Parameters.AddWithValue("@jobCode", "this.txtEnterJobCode.Text");
            cmdInsertJobsToDataBase.Parameters.AddWithValue("@jobTitle", "this.txtEnterJobTitle.Text");
            cmdInsertJobsToDataBase.Parameters.AddWithValue("@lastUpdated", "this.dateTimePickerJobLastUpdated");
            cmdInsertJobsToDataBase.ExecuteNonQuery(); //execute the mysql command
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            if (Connect != null)
            {
                Connect.Close(); //close the connection
            }
        }

}

谢谢!

1 个答案:

答案 0 :(得分:3)

我不是C#开发人员,但看起来不对,我认为在jobTitle之前你有一个额外的括号:

String insertQuery = "INSERT INTO beautyshopdb(job) VALUES(@jobCode, @)jobTitle, @lastUpdated)";

此外,您似乎将变量引用放在引号内,就好像它们是字符串常量一样。我希望这些不需要引号。

cmdInsertJobsToDataBase.Parameters.AddWithValue("@jobCode", "this.txtEnterJobCode.Text");

应该是:

cmdInsertJobsToDataBase.Parameters.AddWithValue("@jobCode", this.txtEnterJobCode.Text);