【问题标题】:How can I update a database table programmatically?如何以编程方式更新数据库表?
【发布时间】:2012-03-29 15:30:45
【问题描述】:

我有一个按钮,当按下它时,设置用户在数据库中的权限。 (如果管理员 UserTypeID 设置为“2”,如果客户设置为“1”)。但是,当我运行以下代码时,一切都保持不变。我认为它来自 SQL 语句,但我不确定。有人可以帮忙吗?

Protected Sub btnSetUser_Click(sender As Object, e As System.EventArgs) _
    Handles btnSetUser.Click

    Dim conn As New OleDbConnection( _
      "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\...\WebSite3\db.mdb;")

    Dim cmd As OleDbCommand = _
      New OleDbCommand("UPDATE [User] SET [UserTypeID] WHERE Username=?", conn)

    conn.Open()
    cmd.Parameters.AddWithValue("@Username", txtUser.Text)

    If ddUserType.SelectedItem.Text = "Administrator" Then
        cmd.Parameters.AddWithValue("@UserTypeID", "2")
        cmd.ExecuteNonQuery()
        lblSetUser.Text = txtUser.Text + "was set to Administrator."
    ElseIf ddUserType.SelectedItem.Text = "Customer" Then
        cmd.Parameters.AddWithValue("@UserTypeID", "1")
        cmd.ExecuteNonQuery()
        lblSetUser.Text = txtUser.Text + "was set to Customer."
    End If

    conn.Close()
End Sub

结束类

【问题讨论】:

  • 请发布一个更具描述性的标题 - 描述您遇到的问题的内容。简单地复制标签没有帮助。

标签: asp.net sql vb.net ms-access


【解决方案1】:

如果你添加一个参数@Username你的命令应该有这样一个参数

SELECT [UserTypeID] FROM [User] WHERE Username = @Username

此外,您稍后会添加一个附加参数,这在您的查询中根本不会出现!您调用cmd.ExecuteNonQuery(),它仅适用于 INSERT、UPDATE 和 DELETE 查询。

您的查询应该如下所示

UPDATE [User]
SET UserTypeID = @UserTypeID
WHERE Username = @Username

Dim cmd As OleDbCommand = New OleDbCommand( _
  "UPDATE [User] SET UserTypeID = @UserTypeID WHERE Username = @Username", conn)

Dim userType As String = ddUserType.SelectedItem.Text
Dim userTypeId As Integer = If(userType = "Administrator", 2, 1)

cmd.Parameters.AddWithValue("@UserTypeID", userTypeId)
cmd.Parameters.AddWithValue("@Username", txtUser.Text)             
conn.Open()
cmd.ExecuteNonQuery()
lblSetUser.Text = txtUser.Text + "was set to " & userType

更新(一些说明)

"UDATE [User] SET UserTypeID = @UserTypeID WHERE Username = @Username"

  • [User]             是表的名称
  • UserTypeID    是用户类型id列的名称
  • @UserTypeID  是用户类型id参数的名称(新值)
  • Username        是用户名列的名称
  • @Username       是用户名参数的名称
  • 您可能需要更改这些名称以符合您的实际情况。

    【讨论】:

    • 它在 cmd.ExecuteNonQuery() 中给了我一个错误,但这是因为 User 是保留关键字,所以我必须添加 [ ]。但是,它没有给我任何错误,但即使我选择“管理员”,UserTypeID 仍然保持为“1”
    • 我将 Dim userTypeId As Integer = If(userType = "Administrator", 2, 1) 更改为 Dim userTypeId As Integer = If(userType = "Administrator", 1, 2) 并且成功了。但是我不能反过来做,即它仍然是'2'。
    • 我可以把它放在一个If语句中,值会根据下拉框的选择而改变吗?例如,如果客户 Dim userTypeId As Integer = If(userType = "Administrator", 2, 1) 和管理员 Dim userTypeId As Integer = If(userType = "Administrator", 1, 2)
    • 不,这个语句已经这样做了。它与If userType = "Administrator" Then userTypeId = 2 Else userTypeId = 1 End If 的作用相同。这里一定有其他事情发生。在这一行设置一个断点,看看userType 是否真的等于“Administrator”。案件必须匹配!试试userType.ToLower() = "administrator",如果有空格userType.ToLower().Trim() = "administrator"
    【解决方案2】:

    您只是在执行一个选择查询 - 它根本不会修改任何数据。

    您将需要使用更新查询,同时为用户名和用户权限编号提供参数。

    【讨论】:

      【解决方案3】:

      您正在使用SELECT 而不是UPDATE...

      New OleDbCommand("SELECT [UserTypeID] FROM [User] WHERE Username=?", conn)
      

      应该是

      New OleDbCommand("UPDATE [User] SET [UserTypeID] = @UserTypeID WHERE Username = @Username", conn)
      

      【讨论】:

      • 我重试了代码,但仍然没有更新。我用了你的,然后试着修改了一下,但都没有效果!我更新了问题中的代码
      • 如果你的代码中应该是SET [UserTypeID] = @UserTypeID,而不仅仅是SET @UserTypeID[UserTypeID] 是表列的名称。 @UserTypeID 是参数的名称。
      猜你喜欢
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多