如何更新用户输入范围内的数据库记录
本文关键字:范围内 输入 数据库 记录 用户 何更新 更新 | 更新日期: 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注入攻击以及为什么您的代码非常不安全,并将其替换为一些正确清理的输入处理。