【问题标题】:DataAdapter update not working against an Access DB [duplicate]DataAdapter 更新不适用于 Access DB [重复]
【发布时间】:2020-07-13 18:28:04
【问题描述】:

我正在尝试创建一个类来存储我的连接字符串和用于插入、更新和删除的通用函数。

测试 INSERT 功能,似乎完成过程没有任何错误,但物理数据库没有新的注册表。

类代码:

Imports System.Data.OleDb

Public Class ControlBD
    ' Connection string
    Private ConBD As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" &
                                         "Data Source=inventariosBD.accdb;")
    ' Data Set
    Private ds As New DataSet

    ' Data Adapter
    Private da As New OleDb.OleDbDataAdapter

    ' SQL queries
    Public Sql As String

    Public Sub cargarDS(tabla)
            sql = "Select * from " & tabla
    da = New OleDb.OleDbDataAdapter(sql, ConBD)
    da.Fill(ds, tabla)
End Sub

Public Sub insertar(tabla As String, valores As Array)
    ' Command Builder 
    Dim cb As New OleDb.OleDbCommandBuilder()

    Dim dsRegistro As DataRow = ds.Tables(tabla).NewRow()

    For i = 0 To UBound(valores)
        dsRegistro.Item(valores(i)(0)) = valores(i)(1)
    Next

    cb.DataAdapter = da
    ds.Tables(tabla).Rows.Add(dsRegistro)
    da.Update(ds, tabla)
End Sub
End Class

表单加载代码:

Public Class formPrincipal
Public ControlBD As New ControlBD

Private Sub formPrincipal_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Dim tabla As String = "productos"
    Dim vals(4) As Array

    ControlBD.cargarDS(tabla)

    vals(0) = {"grupo", "mi_grupo'"}
    vals(1) = {"nombre", "mi_nombre"}
    vals(2) = {"medida", "mi_medida"}
    vals(3) = {"cantidad", "50"}
    vals(4) = {"precio", "80"}

    ControlBD.insertar(tabla, vals)
End Sub

最后,当我在更新行 da.Update(ds, tabla) 放置断点时,VisualStudio 显示如下:

ADO.NET:Ejecutar NonQuery“INSERT INTO productos (grupo, nombre, medida, cantidad, precio) VALUES (?, ?, ?, ?, ?)”。 See ejecutó el texto de comando "INSERT INTO productos (grupo, nombre, medida, cantidad, precio) VALUES (?, ?, ?, ?, ?)" en la conxión "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=inventariosBD.accdb;" y devolvió el número de filas afectadas。

所以查询有问号而不是我要插入的值,但是 VS 调试器显示我的 DataSet 具有正确的新值。哪里错了?

已解决

我在 Visual Studio 的解决方案资源管理器中添加了数据库,因此它会自动将数据库添加到 Bin/Debug 文件夹中。

我在 Visual Studio 中检查数据库,但我意识到它显示的是原始数据库,而不是 Bin/Folder 中的数据库。

换句话说...Visual Studio 向我展示了另一个数据库,而不是受我的代码影响的数据库。

新问题

所以我的代码插入到数据库中,但它替换了相同的注册表,它就像一个更新而不是一个插入,即使输出查询说插入到如上所示。

【问题讨论】:

  • 问号是一个好兆头:这意味着您创建了一个参数化查询,而不是将参数值连接成一个字符串:数据库“服务器”负责处理参数值,而不是代码 - 这太棒了。
  • 很高兴知道问号很好,谢谢...但我仍然有问题:(物理数据库根本没有任何变化
  • 您的方法存在几个问题。您可以从捕获更新结果开始:Dim rowsAffected = da.Update(ds, tabla)。如果它不为零,则数据库正在更新。您可能还需要考虑废弃该帮助程序并将与产品相关的数据库代码移动到产品类中。这将允许代码更具体地用于任务。
  • 我认为你必须在CommandBuilder 上调用GetUpdateCommand,否则它不会有更新命令。与删除和插入相同。我建议您编写自己的查询,而不是依赖命令生成器。

标签: vb.net ms-access vba sqldatadapter


【解决方案1】:

已解决

我在 Visual Studio 的解决方案资源管理器中添加了数据库,因此它会自动将数据库添加到 Bin/Debug 文件夹中。

我在 Visual Studio 中检查数据库,但我意识到它显示的是原始数据库,而不是 Bin/Folder 中的数据库。

换句话说...Visual Studio 向我展示了另一个数据库,而不是受我的代码影响的数据库。

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 2012-08-09
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多