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 数据库的主要内容,如果未能解决你的问题,请参考以下文章