我在VB中运行时出现了一个奇怪的语法错误:
SQLString = "UPDATE Login SET Password = '" + PasswordTextBox.Text + "'"
SQLString += " WHERE UserName = '" + UserNameTextBox.Text + "'"
在进入此部分之前检查Username
,并确定在数据库中。
它给出了一个例外,说明update语句中存在语法错误。任何人都知道什么是错的?
答案 0 :(得分:5)
LOGIN
是SQL Server中的保留字(用于登录帐户管理),因此为了在查询中使用它(即列名),您需要使用[]
来转义它,所以使用[LOGIN]
作为字段名称。
您永远不应该使用字符串连接并将其传递给SQL数据库,因为您将自己暴露给SQL Injection攻击。
您应该使用SqlCommand对象并传递参数。请参阅this article了解如何操作。
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
答案 1 :(得分:2)
我很确定Login是保留字,请尝试将登录更改为[Login]
答案 2 :(得分:1)
密码是一个保留字,所以[密码]修复它,我的讲师为我修好了:)
答案 3 :(得分:0)
不要显示你是如何构建语句的,而是在执行语句时向我们展示SQLString中的内容。
另外,请尝试将列和表名称括在标识符引号字符中,这些字符对于Microsoft而言是[和],对于许多其他数据库,请在`(在代字号键上)。
答案 4 :(得分:0)
在不知道您使用的实际密码和用户名的情况下,我的猜测是其中一个(或两个)中的某些字符导致sql语句过早结束。你应该在执行像这样的sql时使用参数。
答案 5 :(得分:0)
我同意以前的一些答案,关于使用参数(我给@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();
}
答案 6 :(得分:0)
我建议将带有刻度线的单词“login”和“password”包围起来,让处理程序知道它们不会被渲染为保留字。
所以:
更新'登录'SET'密码'
但不是单引号,请使用刻度线(键盘上的左上角键)。我无法正确演示它,因为如果它被刻度线包围,StackOverflow会将它视为一个类。