我是这个论坛的新手,请你帮我把这段代码搞定,当我执行它时,它什么都不做,不更新数据库。如果我删除方括号,则会出现错误:" UPDATE语句中的SYNTAX ERROR" 任何帮助表示赞赏!
Dim connection As OleDbConnection
connection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=UserDB.accdb;Jet OLEDB:Database;")
connection.Open()
Dim pass As String
pass = txtconfirm.Text
Dim user As String
user = LoginForm.UsernameTextBox.Text
Dim query As String = "UPDATE [Users] SET [Password]= '" & pass & "' WHERE [Username]= '" & user & "';"
Dim command As New OleDbCommand(query, connection)
command.ExecuteNonQuery()
connection.Close()
答案 0 :(得分:0)
根据您的实际连接字符串,将要更新的数据库是应用程序启动目录中的数据库。这意味着如果您使用WinForms应用程序,此文件夹是\ BIN \ DEBUG或x86变体。如果没有错误,那么您可以获取ExecuteNonQuery调用的返回值以验证记录是否已更新
Dim rowsUpdated = command.ExecuteNonQuery()
MessageBox.Show("Record updated count = " & rowsUpdated)
如果此值不为零,则表示您的数据库已更新,并且您正在查找错误数据库中的更改。检查BIN \ DEBUG文件夹中的那个。
在任何情况下,您的代码都存在很大问题。如果变量user
或pass
包含单引号,则代码将再次崩溃,因为字符串连接将形成无效的SQL。像往常一样,唯一的解决方法是使用参数化查询
Dim pass = txtconfirm.Text
Dim user = LoginForm.UsernameTextBox.Text
Dim query As String = "UPDATE [Users] SET [Password]= @p1 WHERE [Username]= @p2"
Using connection = New OleDbConnection("...........")
Using command As New OleDbCommand(query, connection)
connection.Open()
command.Parameters.Add("@p1", OleDbType.VarWChar).Value = pass
command.Parameters.Add("@p2", OleDbType.VarWChar).Value = user
command.ExecuteNonQuery()
End Using
End Using
参数化方法有许多优点。您的查询文本更具可读性,您的代码与数据库引擎所期望的值之间不存在误解。虽然使用MS-Access并不容易,但Sql Injection
没有问题答案 1 :(得分:0)
我认为史蒂夫提出了一个更好的方法来编码这个......
让我再说几件事:
你不能取出这些括号的原因是你的一些列名是保留字;仅供参考
因为你报告"它什么都不做......"当你执行时,听起来你有一个有效的连接和sql语法,在这种情况下我的下一步是在调试模式下复制sql命令文本,将其更改为选择并在数据库中运行它。你应该得到一个结果。如果没有,您的标准或字段内容不是您认为的那样......
只需将Update table SET field-value ...
更改为SELECT * FROM table
,然后保留WHERE
子句。