使用 vb.net, oledbdataadapter 更新数据库时出现问题



在浏览了Stackoverflow和其他板上的多个问题/答案之后,我仍然不知道为什么我不能从数据表更新Access数据库。我正在尝试从数据表中获取数据,并将该数据插入到 Access 表中(如果该表为空(,如果该表已有数据,则替换该表。我可以成功替换表,但数据表中的数据没有添加。

但是,我使用的方法似乎不起作用。我的数据表来自绑定的 datagridsource 和访问层的调用方式如下:

ConnectedDB.UpdateTable(DBTable, bsDataSource.DataSource)

其中ConnectedDB是访问层类,DBTable是包含访问表名称的字符串,bsDataSource是绑定数据。如您所见,我传递了.Datasource以将其转换为数据表。

以下是我工作的原始部分(1 月 29 日之前(,用于将数据表添加回 Access 表中:

Public Function UpdateTable(strTable As String, dgDataTable As DataTable) As Boolean
Dim DS As New DataSet
dgDataTable.TableName = strTable
DS.Tables.Add(dgDataTable)
Using OpenCon = New OleDb.OleDbConnection(strConnectionString)
Using DataAdapter As New OleDbDataAdapter("SELECT * FROM " & strTable, OpenCon)
Dim DBcmd As OleDbCommandBuilder = New OleDbCommandBuilder(DataAdapter)
DBcmd.QuotePrefix = "["
DBcmd.QuoteSuffix = "]"
DataAdapter.UpdateCommand = DBcmd.GetUpdateCommand()
Try
OpenCon.Open()
DataAdapter.Fill(DS.Tables(strTable))
If DataAdapter.Update(DS.Tables(strTable)) > 0 Then
Return True
Else Return False
End If
Catch exo As Exception
MessageBox.Show(exo.Message)
Return False
End Try
End Using
End Using
End Function

我的函数尝试使用表示为strTable数据表中的信息(dgDataTable数据网格视图中的信息(更新现有 Access 表。每次运行都命中更新检查> 0 并返回 false,这意味着语法方面它应该正常工作(即没有错误消息(。我已经跟踪了该表,它拥有它应该拥有的所有数据(因此信息通过更新命令从网格正确传递(。我正在尝试将其应用于数据集,但我不确定我是否真的需要它。

我正在通过更新方法跟踪变量,我想我发现了为什么它不会更新,但我不确定该怎么做。它提出的查询是这样的:

UPDATE [RtoC] SET [R] = ?, [C] = ?, [Type] = ?, [Unknown] = ? WHERE (([R] = ?) AND ([C] = ?) AND ([Type] = ?) AND ((? = 1 AND [Unknown] IS NULL) OR ([Unknown] = ?)))

访问表名称为 RtoC,其中包含字段 R、C、类型和未知。 我认为"?"没有被填充,导致查询只是不将数据应用回 Access。我不确定如何设置这些项目。

编辑 1/29/20:我使用了下面的代码更改 I 和 jmcihinney 文档,它确实将行插入到 Access 表中。此编辑更改了问题,以更具体地说明我正在尝试做什么以及如何创建数据表。希望这能澄清我的一些措辞,并为更改行状态提供一些基础。

问题是该数据适配器的Fill方法在填充后在DataTable上调用AcceptChanges,因此当您调用Update时没有要保存的更改。

无论如何,对Fill的调用都不应该存在,因为您不想检索任何数据,只需保存更改即可。 你那里有很多毫无意义的代码。 它应该看起来更像这样:

Public Function UpdateTable(strTable As String, dgDataTable As DataTable) As Boolean
Using DataAdapter As New OleDbDataAdapter("SELECT * FROM " & strTable, strConnectionString)
Dim DBcmd As OleDbCommandBuilder = New OleDbCommandBuilder(DataAdapter)
DBcmd.QuotePrefix = "["
DBcmd.QuoteSuffix = "]"
Try
Return DataAdapter.Update(dgDataTable) > 0
Catch exo As Exception
MessageBox.Show(exo.Message)
Return False
End Try
End Using
End Function

我采取了另一种操作来操纵数据库,在查找时,我找到了 jmcilhinney 在 2014 年提供的答案![从数据表批量插入到访问数据库

在跨数据表行的for each循环中,我设置了这个:row.SetAdded()

如果我正在填充,我会做这样的事情:DataAdapter.AcceptChangesDuringFill = TrueFill命令之前。

除非此方法已更改或有更好的方法,否则我会将链接标记为答案。

谢谢杰姆西欣尼...两次!

相关内容

  • 没有找到相关文章

最新更新