为什么这个数据库访问代码不起作用? vb.net
Why this database access code doesn't work? vb.net
我有一个 Access 数据库,其中的列标题为 Key
和 Username
,我正在尝试将一些数据设置回数据库第一行的 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 的信息,其中将包括哪一列是主键;它在创建更新命令时使用该信息。
我有一个 Access 数据库,其中的列标题为 Key
和 Username
,我正在尝试将一些数据设置回数据库第一行的 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 的信息,其中将包括哪一列是主键;它在创建更新命令时使用该信息。