为啥这个数据库访问代码不起作用? VB.net
Posted
技术标签:
【中文标题】为啥这个数据库访问代码不起作用? VB.net【英文标题】:Why this database access code doesn't work? vb.net为什么这个数据库访问代码不起作用? VB.net 【发布时间】:2018-07-24 15:06:55 【问题描述】:我有一个 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
编辑:P.S:我对代码做了一些编辑,仍然出现错误
【问题讨论】:
It says Item isn't a property. Maybe you are looking for Rows? 如果您有 MS Access 数据库,为什么要尝试使用 MS SQL Server 提供程序对象? @Plutonix:天啊,是的,我为什么要这样做。它应该是OleDbDataAdapter
我猜.. 我猜它使整个代码不正确。 :/ 和 connection
也是错误的。 ://
我应该编辑整个问题。
我编辑了整个问题。现在得到一个不同的错误
【参考方案1】:
您有一个名为“Key”的列,但它实际上是表的主键吗?这就是它想要的。
有两种选择:
(1) 表中没有主键。为了解决这个问题,添加一个或分配一个当前列作为主键。 Add or change a table’s primary key in Access.
(2) 如果另一列是键,您可以将其放入 SELECT 命令中,而不是在此程序中显示/使用它。
原因是当它创建 UPDATE 命令时,它使用主键来标识要更新的行。当它执行 SELECT 时,它首先执行一个额外的查询以获取有关表的信息,其中将包括哪一列是主键;它在创建 UPDATE 命令时使用该信息。
【讨论】:
我试图通过"ALTER TABLE " & table_name & " ADD PRIMARY KEY(" & "Key" & ")"
设置主键这有一个语法错误:Syntax error in CONSTRAINT clause.
有什么问题?
您应该只需要执行一次,所以我想知道您为什么要在程序中而不是在 Access 程序中执行此操作。但是,我认为它需要更像ALTER TABLE [tableName] ADD CONSTRAINT PK_Key PRIMARY KEY ([Key]);
。这会很尴尬,因为“Key”是reserved word in Access。
现在可以使用了。谢谢你。我这样做的原因是,我正在以编程方式创建一个访问数据库,然后填充一些数据,检索数据,更改数据等。所以,我在制作文件后通过代码设置主键更容易,所以我不必手动操作。谢谢【参考方案2】:
您需要为 DataAdapter 提供一个更新命令。您可以通过设置适配器的 .UpdateCommand 属性手动执行此操作。
dad.UpdateCommand = "Update table1 Set
...
或者您可以使用 CommandBuilder 方法。这将根据您的 Select 查询为您生成命令。 (插入、更新、删除)
Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(dad)
【讨论】:
现在它给了我一个不同的错误:Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.
.. 我更新了代码
你在数据库中的表有主键吗?如果它确实将该列添加到您的选择语句中。
如果您的桌子没有,它可能需要一个。您需要有一个主键来唯一标识一条记录。如果没有唯一标识符,数据库将无法更新或删除单个记录。【参考方案3】:
尝试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
【讨论】:
以上是关于为啥这个数据库访问代码不起作用? VB.net的主要内容,如果未能解决你的问题,请参考以下文章