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

How to update database records within a user input range?

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

Syntax error (missing operator) in query expression

所有查询条件均来自用户输入。我尝试了多种来源来寻找答案,但我相信我的 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());
        }
}

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

有人能看到我可能遗漏了什么吗?任何帮助将不胜感激。

您可能遗漏了单引号 '...

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

此外,我假设这只是您正在玩的一个项目,没有任何在线可用的项目?我问的原因是 SQL 查询是 vulnerable to SQL injection attacks.

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

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

(注意单引号)。

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

为什么不将 "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 = @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 查询是什么样的,并且您可以参数化用户的输入以提高安全性(防止任何 sql 注入)。

要解决您的问题,您可能需要调试这段代码并查看 SQL 查询是什么,然后尝试从您的 SQL 客户端工具(例如 Sql management studio),你会更清楚哪里出了问题。

希望这对您有所帮助。 梁亨利