更新语句VB.net中的SQL语法错误
在VB中运行此命令时,我遇到一个奇怪的语法错误:更新语句VB.net中的SQL语法错误,sql,vb.net,sql-update,oledb,Sql,Vb.net,Sql Update,Oledb,在VB中运行此命令时,我遇到一个奇怪的语法错误: SQLString = "UPDATE Login SET Password = '" + PasswordTextBox.Text + "'" SQLString += " WHERE UserName = '" + UserNameTextBox.Text + "'" 进入此部分之前,将检查用户名,并将其明确地保存在数据库中。 它给出了一个异常,说明update语句中存在语法错误。有人知道怎么回事吗?我很确定
SQLString = "UPDATE Login SET Password = '" + PasswordTextBox.Text + "'"
SQLString += " WHERE UserName = '" + UserNameTextBox.Text + "'"
进入此部分之前,将检查用户名
,并将其明确地保存在数据库中。
它给出了一个异常,说明update语句中存在语法错误。有人知道怎么回事吗?我很确定登录是一个保留字,请尝试将Login更改为[Login]在SQL Server中是一个保留字(用于登录帐户管理),因此为了在查询(即列名)中使用它,您需要使用
[]
对其进行转义,因此使用[Login]
作为字段名
您永远不应该使用字符串连接并将其传递给SQL数据库,因为您将自己暴露在攻击之下
您应该使用SqlCommand对象并传递参数。请参见如何执行此操作
SQLString = "UPDATE [Login] SET Password = @password "
SQLString += " WHERE UserName = @userName"
...
dbCommand.Parameters.Add("@password", SqlDbType.VarChar, 50)
dbCommand.Parameters["@password"].Value = PasswordTextBox.Text
dbCommand.Parameters.Add("@userName", SqlDbType.VarChar, 50)
dbCommand.Parameters["@userName"].Value = UserNameTextBox.Text
不显示如何构建语句,而是显示执行语句时SQLString中的内容
另外,请尝试将列名和表名括在标识符引号中,对于Microsoft是[和],对于许多其他数据库是`(在波浪线键上)。在不知道实际密码和用户名使用的是什么的情况下,我猜某个字符是一个(或两个)中的某个字符其中一种是导致sql语句过早结束的原因。在执行这样的sql时,应该真正使用参数
看看这个:Password是一个保留字,所以[Password]修复了它,我的讲师为我修复了:)我同意前面的一些答案,关于使用参数(我给@Oded加了+1)和将[]与表名和字段名一起使用(我给SQLMenace加了+1) 总之,我认为这是启动查询的最正确方式:
using(SqlConnection connection = new SqlConnection("<your connection string>"))
{
connection.Open();
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "UPDATE [Login] SET [Password] = @PasswordParameter WHERE [UserName] = @UserNameParameter";
command.Parameters.AddWithValue("@PasswordParameter", PasswordTextBox.Text);
command.Parameters.AddWithValue("@UserNameParameter", UserNameTextBox.Text);
command.ExecuteNonQuery();
}
使用(SqlConnection=newsqlconnection(“”)
{
connection.Open();
SqlCommand=newsqlcommand();
command.Connection=连接;
command.CommandText=“更新[Login]设置[Password]=@PasswordParameter其中[UserName]=@usernameparmeter”;
command.Parameters.AddWithValue(“@PasswordParameter”,PasswordTextBox.Text);
command.Parameters.AddWithValue(“@usernameparmeter”,UserNameTextBox.Text);
command.ExecuteNonQuery();
}
我建议在单词“login”和“password”周围加上记号,让处理程序知道它们不会被呈现为保留单词
因此:
更新“登录”设置“密码”
但不要使用单引号,而是使用勾号(键盘左上键)。我无法正确演示它,因为StackOverflow会将它视为一个类,如果它被勾号包围。如果用户名包含撇号,例如,您将得到一个语法错误。无论如何,你应该使用参数化查询。这只是一个蹩脚的大学项目,不需要阻止SQLInjection,因为它无论如何都看不到曙光。非常正确,但他们说按自己的方式做,所以我不能反对