使用vb.net将Datagrid转换为dbf数据库

时间:2016-10-27 04:23:57

标签: vb.net datagridview visual-foxpro

Datagrid到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 area.dbf", con)
    Dim cb = New OleDbCommandBuilder(da)
    cb.QuotePrefix = "["
    cb.QuoteSuffix = "]"
    da.Fill(dt)
    dt.Merge(dt1)
    dbfdatagrid.DataSource = dt.DefaultView
    con.Close()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    con1.Close()
    con1.ConnectionString = "Provider=vfpoledb.1;Data Source=C:\dbf_folder1;Collating Sequence=machine;"
    con1.Open()
    da1 = New OleDbDataAdapter("Select * from area.dbf", con1)
    Dim cb = New OleDbCommandBuilder(da1)
    cb.QuotePrefix = "["
    cb.QuoteSuffix = "]"
    Dim columns(5) As DataColumn
    columns(4) = dt.Columns("NAME")
    dt.PrimaryKey = columns

    da1.Fill(dt1)
    da1.Update(dt)

1 个答案:

答案 0 :(得分:0)

查看你的代码(我不熟悉VB,我更像是一个C#人),这不是VFP的问题,你的代码在给定任何数据库时都很奇怪。

当数据库是VFP时,你不应该使用那些QuotePrefix和QuoteSuffix。这本身就会产生一个错误的更新命令。您也可以手动编写更新命令。

虽然我不了解VB,但您的代码是否创建了6个元素的DataColumn数组并且仅设置为第5个,而其他代码为主键为NULL?可能的目的是什么?实际上,如果您没有有效的主键,则不需要指定主键(那么您需要手动编写更新命令 - 如果您可以构建有效的更新命令,那么这也是您的问题。正确更新您需要的行)。让我们假设,您使用了良好的数据库原则并在表中拥有主键。然后你不需要编写手动更新,只需让CommandBuilder为你构建它。即:

Sub Main()
    Dim tbl As New DataTable()

    Dim adapter = New OleDbDataAdapter("select * from Customer", "Provider=VFPOLEDB;Data Source=C:\PROGRAM FILES (X86)\MICROSOFT VISUAL FOXPRO 9\SAMPLES\data")

    adapter.Fill(tbl)

    Dim cb = New OleDbCommandBuilder(adapter)
    adapter.UpdateCommand = cb.GetUpdateCommand()

    Dim f = New Form()
    Dim btn = New Button With {
        .Top = 10,
        .Text = "Update"
    }
    Dim dgv = New DataGridView With {
        .Top = 50,
        .DataSource = tbl
    }
    f.Controls.AddRange(New Control() {btn, dgv})
    AddHandler btn.Click, Sub(sender, args)
                              adapter.Update(tbl)
                          End Sub

    f.Show()
End Sub

如果您的表没有主键,构建器可以从架构中提取,那么您也可以编写自己的手动更新代码。仅用于采样,假设您在c:\ Temp中有一个名为NoPK的表(v1 i,v2 c(10))。虽然它没有索引信息并且它是一个免费表(构建器无法确定PK),但我们知道v1是我们的密钥,我们只想更新v2,可以这样做:

Sub Main()
    Dim tbl As New DataTable()

    Dim adapter = New OleDbDataAdapter("select * from NoPK", "Provider=VFPOLEDB;Data Source=c:\Temp")

    adapter.Fill(tbl)

    adapter.UpdateCommand = New OleDbCommand("update NoPK set v2=? where v1=?", adapter.SelectCommand.Connection)
    adapter.UpdateCommand.Parameters.AddWithValue("p1", "").SourceColumn = "v2"
    adapter.UpdateCommand.Parameters.AddWithValue("p2", 0).SourceColumn = "v1"


    Dim f = New Form()
    Dim btn = New Button With {
        .Top = 10,
        .Text = "Update"
    }
    Dim dgv = New DataGridView With {
        .Top = 50,
        .DataSource = tbl
    }
    f.Controls.AddRange(New Control() {btn, dgv})
    AddHandler btn.Click, Sub(sender, args)
                              adapter.Update(tbl)
                          End Sub

    f.Show()
End Sub

请注意,对于OleDb,参数应以相同的顺序添加到集合中,并在命令文本中添加相应的占位符(?)(我不会先添加p2)。