【问题标题】:Datagrid to dbf database using vb.net使用 vb.net 将 Datagrid 转换为 dbf 数据库
【发布时间】:2016-10-27 04:23:56
【问题描述】:

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)

【问题讨论】:

    标签: vb.net datagridview visual-foxpro


    【解决方案1】:

    看你的代码(我不懂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)) 的表。虽然它没有索引信息并且是一个空闲表(builder 无法确定 PK),但我们知道 v1 是我们的 key,我们只想更新 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,参数应以与命令文本中相应的占位符 (?) 相同的顺序添加到集合中(IOW,您不会先添加 p2)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2011-04-23
      • 2011-05-25
      • 2013-10-13
      • 2016-02-26
      • 1970-01-01
      相关资源
      最近更新 更多