如何在用户输入范围内更新数据库记录?

时间:2015-11-13 18:47:50

标签: c# sql sql-update ms-access-2010

我正在尝试使用SQL和C#更新Access中的范围内的数据库记录。使用UPDATE查询会一直给我一个错误

  

查询表达式中的语法错误(缺少运算符)

所有查询条件均来自用户输入。我已经尝试了很多来源找到答案,但我相信我的SQL语句是正确的。以下是执行我需要的任务的方法。

private void btnUpdate_Click(object sender, EventArgs e)
{
        int teamYear = Convert.ToInt32(this.textBoxBegYear.Text);
        int endYear = Convert.ToInt32(this.textBoxEndYear.Text);
        string teamName = this.textBoxTeamName.Text;
        string league = this.textBoxLeague.Text;
        string conference = this.textBoxConf.Text;
        string division = this.textBoxDivision.Text;

        try
        {
            dbConn = new OleDbConnection();
            dbConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" 
               + ch + openFileDialog1.FileName + ch;
            dbConn.Open();

            sql = "UPDATE " + this.comboBox1.SelectedItem.ToString() 
               + " SET LeagueName = @leagueName, ConferenceName = @conferenceName, 
               DivisionName = @divisionName WHERE TeamName = " + this.textBoxTeamName.Text 
               + " AND TeamYear BETWEEN " + this.textBoxBegYear.Text 
               + " AND " + this.textBoxEndYear.Text;

            dbCmd = new OleDbCommand(sql, dbConn);

            for (int i = teamYear; i <= endYear; i++)
            {
                dbCmd.Parameters.AddWithValue("@leagueName", league);
                dbCmd.Parameters.AddWithValue("@conferenceName", conference);
                dbCmd.Parameters.AddWithValue("@divisionName", division);
                dbCmd.ExecuteNonQuery();
            }
            dbCmd.Connection.Close();
            dbConn.Close();
        }
        catch (Exception err)
        {
            MessageBox.Show("Error: " + err.Message.ToString());
        }
}

异常来自WHERE子句后请求缺少运算符的SQL语句的后半部分。

有人能碰巧看到我可能遗失的东西吗?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可能缺少单引号' ...

TeamName = '" + this.textBoxTeamName.Text + "'

另外,我假设这只是一个你正在玩的项目而且没有任何可以在网上获得的项目?我问的原因是SQL查询是vulnerable to SQL injection attacks

答案 1 :(得分:1)

您需要使用单引号从用户输入中转义文本。

WHERE TeamName = '" + this.textBoxTeamName.Text 
               + "' AND TeamYear BETWEEN " + this.textBoxBegYear.Text 
               + " AND " + this.textBoxEndYear.Text;

(注意单引号)。

请不要使用您发布的代码。请阅读SQL注入攻击以及为什么您的代码非常不安全,并将其替换为一些正确清理的输入处理。

答案 2 :(得分:1)

为什么不替换&#34;尝试&#34;中的代码?阻止这个:

        dbConn = new OleDbConnection();
        dbConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" 
           + ch + openFileDialog1.FileName + ch;
        dbConn.Open();

        sql = "UPDATE " + this.comboBox1.SelectedItem.ToString() 
           + " SET LeagueName = @leagueName, ConferenceName = @conferenceName, 
           DivisionName = @divisionName WHERE TeamName = @teamName AND TeamYear BETWEEN @begYear AND @endYear";

        dbCmd = new OleDbCommand(sql, dbConn);

        for (int i = teamYear; i <= endYear; i++)
        {
            dbCmd.Parameters.AddWithValue("@leagueName", league);
            dbCmd.Parameters.AddWithValue("@conferenceName", conference);
            dbCmd.Parameters.AddWithValue("@divisionName", division);
            dbCmd.Parameters.AddWithValue("@teamName", this.textBoxTeamName.Text);
            dbCmd.Parameters.AddWithValue("@begYear", int.Parse(this.textBoxBegYear.Text));
            dbCmd.Parameters.AddWithValue("@endYear", int.Parse(this.textBoxBegYear.Text));
            dbCmd.ExecuteNonQuery();
        }
        dbCmd.Connection.Close();
        dbConn.Close();

因此,您可以更好地了解SQL查询的外观,并参考化用户&#39;输入以提高安全性(防止任何sql注入)。

要解决您的问题,您可能需要调试这段代码并查看SQL查询的内容,并尝试从SQL客户端工具(例如Sql management studio)执行它,您将更好地了解出了什么问题。

希望这会有所帮助。 Henry Liang