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

时间:2018-07-24 15:06:56

标签: vb.net visual-studio-2012

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

  

对于不返回任何键列信息的SelectCommand,不支持为UpdateCommand生成动态SQL。

代码:

 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

编辑:PS:我对代码进行了一些编辑,但仍然收到该错误

3 个答案:

答案 0 :(得分:0)

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

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

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

在数据库中查找可能的空值。它们将在上面的示例中导致异常。检查Null值,如下所示:

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

答案 1 :(得分:0)

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

dad.UpdateCommand = "Update table1 Set ...

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

Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(dad)

答案 2 :(得分:0)

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

有两种选择:

(1)您的表中没有主键。要解决此问题,请添加一个或将当前列分配为主键。 Add or change a table’s primary key in Access

(2)如果另一列是键,则可以将其放入SELECT命令,而不必在该程序中显示/使用它。

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