无法使用 vb.net 将数据网格更新为 dbf

Posted

技术标签:

【中文标题】无法使用 vb.net 将数据网格更新为 dbf【英文标题】:couldnot update datagrid to dbf using vb.net 【发布时间】:2018-05-04 04:19:27 【问题描述】:

我是编程新手,但很多时候没有任何课程学习和研究,所以我经常遇到问题。 Stack Over flow 是为我解决问题的正确场所。

这次我将 datagridview 更新为 .dbf 文件,用于另一个使用 .dbf 数据库的应用程序。所以请给我一个更好的解决方案来准备我的申请。

我的错误是“不支持不返回任何键列信息的 SelectCommand 为 UpdateCommand 生成动态 SQL。”

Dim con As New OleDbConnection
Dim ds As New DataSet
Dim dt As New DataTable
Dim da As New OleDbDataAdapter
Dim con1 As New OleDbConnection
Dim ds1 As New DataSet
Dim dt1 As New DataTable
Dim da1 As New OleDbDataAdapter
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       con.ConnectionString = "Provider=vfpoledb.1;Data Source=C:\dbf_folder;Collating Sequence=machine;"
    con.Open()
    ds.Tables.Add(dt)
    da = New OleDbDataAdapter("Select * from voterlist.dbf", con)
    da.Fill(dt)
    dbfdatagrid.DataSource = dt.DefaultView
    con.Close()
End Sub
Private Sub btnupdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnupdate.Click
    con1.Close()
    con1.ConnectionString = "Provider=vfpoledb.1;Data Source=C:\dbf_folder1;Collating Sequence=machine;"
    con1.Open()
    da1 = New OleDbDataAdapter("Select * from voterlist.dbf", con1)
    Dim cb = New OleDbCommandBuilder(da1)
    Dim primaryKey(1) As DataColumn
    primaryKey(1) = dt1.Columns("areaid")
    dt1.PrimaryKey = primaryKey
    da1.Fill(dt)
    dt.Merge(dt1)
    da1.Update(dt)
End Sub

【问题讨论】:

你的数据库表有主键吗?如果不是,则命令生成器无法唯一标识一条记录以进行更新或删除。另外,在调用Fill之前,将数据适配器的MissingSchemaAction设置为AddWithKey 顺便想想New 关键字的实际作用。它不是声明的一部分。它实际上创建了一个新对象。为什么在创建表单时创建两个数据适配器,然后在检索数据时创建另一个,然后在保存时创建另一个?您只需要一个数据适配器,因此去掉其中一个变量,只使用一次New 关键字。您也不需要两个不同的连接对象。如果要在使用对象时创建对象,请不要使用成员变量。 你为什么还要使用两个不同的DataSets?您只需要一个DataTable。摆脱所有DataSetsDataTables 之一。创建一个DataTable 并在启动时将其传递给Fill 调用,然后在保存时将相同的DataTable 传递给Update 调用。 【参考方案1】:

您需要告诉 DataSet/DataTable 主键是什么:

' For dataset DS, assumed there is one table
Dim PrimaryKey(1) As DataColumn
PrimaryKey(1) = ds.Tables(0).Columns("ID")
DS.Tables(0).PrimaryKey = PrimaryKey

' For DataTable DT
Dim PrimaryKey(1) As DataColumn
PrimaryKey(1) = dt.Columns("ID")
dt.PrimaryKey = PrimaryKey

更新

您使用了正确的驱动程序,您需要在 DBF 中创建一个 Unique 列。为此,请先在 DBF 上执行此 SQL,然后再使用它:

ALTER TABLE voterlist ALTER COLUMN areaid INT UNIQUE (I assume an integer column, if character, areaid C(somenumber) where somenumber is the size of the column)

这将在 areaid 列上创建一个索引,该索引将(应该)用作主键。

【讨论】:

您的代码在数据集中运行,但我将在显示错误后更新“da.update(dt)”。谢谢 好吧...自从我不得不处理 DBF 以来已经有一段时间了,您需要在 DBF 上定义主键。您知道 DBF 是如何创建的(Dbase、FoxPro 等)吗?我看到你正在使用 OLEDB。您是否有权访问创建 DBF 的产品?如果您这样做,您可以在不破坏数据的情况下定义密钥。如果您必须创建一个将 ID 列定义为主键的 DBF,请将数据复制到新的 DBF,然后从那里继续,假设这是一个选项。 非常感谢您回复我,这个由 FoxPro 创建的 DBF 请分享给我任何已更新到 dbf 的代码,我会尝试之后

以上是关于无法使用 vb.net 将数据网格更新为 dbf的主要内容,如果未能解决你的问题,请参考以下文章

数据网格视图更新,在 vb.net windows 窗体中编辑和删除,使用多个表来填充 datagridview

VB.net 中的 DataGridView 不允许我更新

SQL 在 VB.NET 中更新数据库,遇到问题

如何使用 vb.net 2003 在 asp.net 1.1 中手动填充数据网格?

使用 VB.Net 将 excel 中的特定列值导出到数据网格

Vb.net 编辑 DatagridView