VB.NET 2008 DataGridView 不更新 Visual Foxpro 数据库

Posted

技术标签:

【中文标题】VB.NET 2008 DataGridView 不更新 Visual Foxpro 数据库【英文标题】:VB.NET 2008 DataGridView not Updating Visual Foxpro Database 【发布时间】:2011-02-19 03:09:01 【问题描述】:

我正在使用带有 DataGridView 的 VB.NET 2008,并且正在使用 vfpoledb.1 驱动程序连接到 Visual Foxpro 6 数据库。当我更改描述字段中的值时,它会在 DataGridView 中更改,但数据库永远不会更新。我是否需要使用代码来强制进行更改?

这是我正在使用的代码:

Imports System.Data.OleDb

Public Class Form1
    Dim sConString As String = "Provider=vfpoledb.1;Data Source=C:\MyDatabase.dbc;Mode=3;"
    Dim con As OleDbConnection = New OleDbConnection(sConString)

    Private Function FetchData()

        con.Open()
        Dim ds As DataSet = New DataSet()
        Dim sSQL As String
        sSQL = "SELECT item_cd, item_desc FROM invent;"

        Dim cmd As OleDbCommand = New OleDbCommand(sSQL, con)
        Dim daInv As OleDbDataAdapter = New OleDbDataAdapter(cmd)
        Dim iRecCount As Integer
        iRecCount = daInv.Fill(ds, "invent")
        Me.DataGridView1.DataSource = ds.Tables("invent").DefaultView
    End Function

    Private Sub btnFetchData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFetchData.Click
        Call FetchData()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        con.Close()
        con = Nothing
    End Sub
End Class

【问题讨论】:

【参考方案1】:

此代码是否会更新表并将更改推送回数据库?我不这么认为。我用 SQL Server 2005 尝试了相同的代码,但它不起作用(我没有 FoxPro db)。所以我修改了代码,现在它工作正常。

Imports System.Data.OleDb

Public Class Form1
    Dim sConString As String = "Provider=vfpoledb.1;Data Source=C:\MyDatabase.dbc;Mode=3;"
    Dim con As OleDbConnection = New OleDbConnection(sConString)
    Dim daInv As OleDbDataAdapter
    Dim ds As DataSet = New DataSet()
    Private Sub FetchData()
        con.Open()
        Dim sSQL As String
        sSQL = "SELECT item_cd, item_desc FROM invent;"
        Dim cmd As OleDbCommand = New OleDbCommand(sSQL, con)
        daInv = New OleDbDataAdapter(cmd)
        Dim builder As New OleDbCommandBuilder(daInv)
        Dim iRecCount As Integer
        iRecCount = daInv.Fill(ds, "invent")
        Me.DataGridView1.DataSource = ds.Tables("invent").DefaultView
    End Sub

    Private Sub btnFetchData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFetchData.Click
        Call FetchData()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs)
        daInv.Update(ds.Tables("invent"))
        con.Close()
        con = Nothing
    End Sub
End Class

希望它有效:)

【讨论】:

您是否总是必须在数据适配器上运行显式更新命令才能推送更新?有没有什么方法可以在用户编辑完记录后立即推送更新? 我将变量 ds、daInv 和 cmd 移到顶部,以便它们是“全局变量”,然后我将您的代码放在您建议的位置。当我尝试运行它时,我收到以下错误消息:Update requires a valid UpdateCommand when passed DataRow collection with modified rows. 我认为你需要明确地调用它。我不确定还有另一种方法可以做到这一点。让我试试。 @HK1:我找不到其他链接或代码,可以帮助您直接更新数据库,但是您可以在cellleave事件中做一些事情并模拟这种体验。但我不认为它是好方法,因为它会增加网络带宽。 好的,我得到了我的 OleDbCommandBuilder 设置,但是因为我没有指定主键,所以它被炸毁了。我很确定该表确实有一个,但显然 OLE DB 连接/驱动程序无法识别它。有没有办法在 DataSet 表上设置主键?【参考方案2】:

我发现了底层问题并解决了它。我正在访问的 VFP 表没有定义主键。它确实有索引,但它们被简单地标记为“常规”索引(使用 VFP 术语)。

我能够使用 Ed Leafe 网站上名为 vRunFox (Visual Run Fox) 的 VFP 工具来修改表结构。我不得不使用一些 VFP 命令来调出表格设计器窗口。

我还必须在我的 FormClosing 事件中添加一些代码。这是我的 FormClosing 事件现在的样子:

    Dim myBuilder As OleDbCommandBuilder = New OleDbCommandBuilder(daInv)
    myBuilder.GetUpdateCommand()
    daInv.UpdateCommand = myBuilder.GetUpdateCommand
    daInv.Update(ds.Tables("invent"))
    con.Close()
    con = Nothing

【讨论】:

以上是关于VB.NET 2008 DataGridView 不更新 Visual Foxpro 数据库的主要内容,如果未能解决你的问题,请参考以下文章

vb.net Datagridview添加行

VB.NET:清除 DataGridView

关于VB.NET中 datagridview 刷新问题

VB.NET中DataGridView谁帮忙?

vb.net中如何获得DataGridView单元格内容

vb.net中怎样求DataGridView的行数和列数?