如何编辑访问数据库中的特定实体

How to edit a specific entity inside an access database

我创建了一个访问数据库,用于存储用户创建的所有抽认卡。
这是:

当用户创建抽认卡时,难度设置为 3,用户可以通过 txtDifficulty 更改难度

 Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click
    Dim sql As String
    sql = "UPDATE flashcards set difficulty = " & TxtDifficulty.Text 'Changes difficulty to user input       
    runSQL(sql) 'runs SQL
End Sub

上述代码的问题在于它编辑了数据库中的每一个抽认卡,而不仅仅是单个抽认卡。

Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click
    Dim sql As String
    sql = "UPDATE flashcards set difficulty = " & TxtDifficulty.Text 'Changes difficulty to user input
    sql = sql & "WHERE Front = " & txtFront.Text
    runSQL(sql) 'runs SQL
End Sub

我编辑了上面的代码,我认为它只会编辑数据库中 Front 等于 txtfront.text 的地方,这是向用户显示抽认卡的文本框,但这只会产生错误.

我想知道如何只编辑用户所在的特定抽认卡。我猜这可能与访问数据库中的唯一标识符有关,但我不确定如何实现它

你的想法“只编辑数据库中 Front 等于 txtfront.text 的地方”是个好主意,但是将值连接到 SQL 查询中充满了潜在的问题。

如果将值作为 SQL 参数传递给查询,那么您无需担心在值周围加上引号,这是问题中代码的问题之一。

您可以将 SQL 查询写在多行上以使其更易于阅读:查询中的额外空格是可以的,但不能有空格(问题中代码的另一个问题)是个问题,一般是语法错误。

如果将数据库操作保存在单独的方法中,它会将代码的每个部分保存在自己的方法中,这样可以更容易地确保每个部分都在做它应该做的事情,也更容易维护。

Sub UpdateDifficultyLevel(front As String, difficulty As Integer)

    Dim sql = "UPDATE flashcards SET difficulty = ?
                WHERE Front = ?"

    Using conn As New OleDbConnection("yourConnectionStringHere"),
           cmd As New OleDbCommand(sql, conn)

        cmd.Parameters.Add("@difficulty", OleDbType.Integer).Value = difficulty
        cmd.Parameters.Add("@front", OleDbType.VarWChar).Value = front

        conn.Open()
        cmd.ExecuteNonQuery()

    End Using

End Sub

Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click

    Dim difficulty As Integer

    If Integer.TryParse(TxtDifficulty.Text, difficulty) Then
        Dim front = txtFront.Text
        UpdateDifficultyLevel(front, difficulty)
    Else
        ' tell user that the difficulty must be a number
    End If

End Sub

参数在查询中用问号表示,您必须按照使用顺序添加参数。为每个参数命名(“@front”等)只是为了更容易看出哪个是哪个(如果使用另一个数据库,例如 SQL Server,则实际上会使用该名称) .

Using 语句确保任何“非托管资源”在使用后被释放。

您可能还需要在更新查询中使用 UserID,但我无法从问题中判断。