2

我好像有问题。我有一个dataset(excel)来源于datagridview一个 Windows 窗体应用程序。我希望在对单元格进行更改后找到一种方法来刷新/更新我dataset的内容。datagridview

让我来看看我为尝试实现这一目标所采取的步骤。我button在表单中添加了“刷新”,并创建了一个名为的方法,该方法write2DGVdatasetdatagridview.

我添加了一个计时器,它允许 Excel 更新以更新输出。我还添加了代码来清除我的dataset(这是 的数据源datagridview)。最后我有一个检索方法,它将dataset通过datagridview.oledataadapter

不幸的是,当我运行代码时,我收到一条错误消息,提示您没有提供密钥作为 get update 方法的参数。我不确定它们所说的“键”是什么意思,get update 方法的参数唯一有效的数据类型是布尔值。我的代码如下:

'Declarations
Dim myDataSet As DataSet
Dim MyCommand As OleDb.OleDbDataAdapter
Dim objWorkSheet As Excel.Worksheet = objExcel.ActiveSheet
Dim sizetimer As New System.Timers.Timer

Sub retrieveMyDataSet()
    MyCommand = New OleDbDataAdapter(select * from [MyExcelWorksheet$A13:x150], MyConnection)
     myDataSet = New System.Data.DataSet()
    MyCommand.Fill(myDataSet)
    myDataGridView.DataSource = myDataSet.Tables(0).DefaultView
End Sub

Sub write2Size()
    'A-k gets written.  Entire graph goes to a-x so I only need to writ the columncount -14
   'x is letter 24. k is letter 11.  24-11 = 13.  So, offset needs to be -13
   '39;Rows 13 through first blank
        Dim rowindex As Integer
        Dim columnindex As Integer
        For rowindex = 1 To myDataGridView.RowCount
        For columnindex = 1 To myDataGridView.ColumnCount - 13
            objWorkSheet.Cells(rowindex + 13, columnindex + 0) = myDataGridView(columnindex     - 1, rowindex - 1).Value
        Next
    Next
End Sub

Sub refreshDGV()
    write2DGV()
    myDataSet.Clear()
    Dim x As New OleDbDataAdapter("select * from [MyExcelWorksheet$A13:x150]", MyConnection)
    Dim oledbCommands As New OleDb.OleDbCommandBuilder(x)
    x.UpdateCommand = oledbCommands.GetUpdateCommand() 'oops type! removed = x.UpdateCommand
    x.Update(myDataSet)
    sizetimer.AutoReset = True
    sizetimer.Interval = 2000 '2 seconds
    retrieveMyDataSet()
End Sub

Private Sub refreshbtn_Click(sender As System.Object, e As System.EventArgs) Handles refreshbtnSize.Click
   refreshDGV()
End Sub
4

1 回答 1

1

不幸的是,当我运行代码时,我收到一条错误消息,提示我没有提供密钥作为 get update 方法的参数。

这个错误的原因在这篇文章中有解释,你应该仔细阅读:How To Use ADO.NET to Retrieve and Modify Records in an Excel Workbook With Visual Basic .NET

您正在使用本文中提到的解决方案之一来更新工作表,即更改您已用 Excel 工作簿中的表/查询填充的 DataSet,然后调用 DataAdapter 的 Update 方法来解决来自 DataSet 的更改回到工作簿。

但就在我们阅读之后:

但是,要使用 Update 方法进行更改解析,您必须为 DataAdapter 的 InsertCommand 设置参数化命令

INSERT INTO [Sheet1$] (F1, F2) values (?, ?) 

和更新命令:

UPDATE [Sheet1$]SET F2 = ? WHERE F1 = ? 

需要参数化的 INSERT 和 UPDATE 命令,因为 OleDbDataAdapter 不提供 Excel 工作簿的键/索引信息;没有键/索引字段,CommandBuilder 无法自动为您生成命令。

信息很明确:如果你想实现你想要做的事情,你必须显式地编写参数化INSERT和命令。UPDATE

并且不要忘记 Excel 有很多功能,但并不是专门为用作数据库而设计的。所以为了避免很多问题,我建议你切换到另一个本地数据库(SqlServerCompact,SQLlLite,...)。

于 2013-08-26T22:09:57.953 回答