我有一个Access数据库,其中的标题为Key
和Username
列,我正在尝试将一些数据设置回数据库第一行的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:我对代码进行了一些编辑,但仍然收到该错误
答案 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命令时会使用该信息。