更新语句VB.net中的SQL语法错误

更新语句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语句中存在语法错误。有人知道怎么回事吗?我很确定

在VB中运行此命令时,我遇到一个奇怪的语法错误:

        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,因为它无论如何都看不到曙光。非常正确,但他们说按自己的方式做,所以我不能反对