为什么这个数据库访问代码不起作用? vb.net

Why this database access code doesn't work? vb.net

我有一个 Access 数据库,其中的列标题为 KeyUsername,我正在尝试将一些数据设置回数据库第一行的 Username 列。但是我得到一个错误:

Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.

代码:

 Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
        Dim connection_string As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.UserAppDataPath & "\DDL.mdb"
        Dim strSql As String = "SELECT Key,Username FROM table1"
        Dim dtb As New DataTable
        Dim command As New OleDbCommand
        'Dim dataset As DataSet
        Using cnn As New OleDbConnection(connection_string)
            cnn.Open()
            Using dad As New OleDbDataAdapter(strSql, cnn)
                dad.Fill(dtb)
                '/// send data from datatable to database
                Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(dad)


                command.Connection = cnn
                command.CommandText = "update * from table1"

                'set data
                dtb.Rows(0)("Username") = "PG"
                dad.Update(dtb)

            End Using
        End Using
    End Sub
End Class

编辑:P.S: 我对代码进行了一些编辑,仍然出现该错误

尝试 dtb.rows(0).item("Name") 为数据表第一行中的名称

使用 DirectCast(dtb.rows(0).item("Name"),String) 将值用作字符串。

TextBox10.Text = DirectCast(dtb.rows(0).item("Name"),String)

注意数据库中可能存在的空值。它们将导致上面示例中的异常。按如下方式检查空值:

If IsDBNull(dtb.rows(0).item("Name")) then
    TextBox10.Text = ""
Else
    TextBox10.Text = DirectCast(dtb.rows(0).item("Name"),String)
EndIf

您需要为 DataAdapter 提供更新命令。您可以通过设置适配器的 .UpdateCommand 属性 来手动执行此操作。

dad.UpdateCommand = "Update table1 Set...

或者您可以使用 CommandBuilder 方法。这将根据您的 Select 查询为您生成命令。 (插入、更新、删除)

Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(dad)

您有一个名为 "Key" 的列,但它实际上是 table 的主键吗?这就是它想要的。

有两种选择:

(1) 您在 table 中没有主键。要解决这个问题,请添加一个或指定一个当前列作为主键。 Add or change a table’s primary key in Access.

(2) 如果另一列是键,您可以将其放入 SELECT 命令中,并且根本不在该程序中显示 it/use 它。

原因是当它创建 UPDATE 命令时,它使用主键来标识要更新的行。当它执行 SELECT 时,它首先执行一个额外的查询以获取有关 table 的信息,其中将包括哪一列是主键;它在创建更新命令时使用该信息。