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

本文关键字:范围内 输入 数据库 记录 用户 何更新 更新 | 更新日期: 2023-09-27 18:22:00

我正在尝试使用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());
        }
}

该异常来自SQL语句的后半部分,该后半部分位于WHERE子句之后,用于请求缺少运算符。

有人能看到我可能缺少的东西吗?如有任何帮助,我们将不胜感激。

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

为什么不将"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)执行它,您会更好地了解出了什么问题。

希望这能有所帮助。Henry Liang

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

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注入攻击以及为什么您的代码非常不安全,并将其替换为一些正确清理的输入处理。