1

在解释我的代码问题之前,我将从背景故事开始。我正在使用 MS Access 2010。我已经能够导入包含两列的数据表。然后,我能够通过向导入的表中添加具有适当值的字段来管理数据。现在,我需要获取整理表并将其集成到我的数据库中。但是,我不能使用任何 Microsoft 内置查询,因为这些似乎都不能满足我的需要。集成将表格分开,是的,但它需要保留每条记录中数据的关系。

为此,我一直在用 VBA 编写一些代码:

Function IntegrateNIRData(curatedTable, queryRecords)

    On Error GoTo Error_Handler
    Dim db As DAO.Database
    Dim rsCuratedTable, rsDBRecords As DAO.Recordset
    Dim iCount As Integer

    Set db = CurrentDb()
    Set rsCuratedTable = db.OpenRecordset(curatedTable, dbOpenTable) 'open the recordset for use (table, Query, SQL Statement)
    Set rsDBRecords = db.OpenRecordset("NIR_Samples_verify", dbOpenDynaset, dbExecDirect, dbOptimisticValue)

    With rsCuratedTable
        If Not (.BOF And .EOF) Then
            Do While Not .EOF
                ' Rest of your code here.
                rsDBRecords.AddNew
                    'Assign Fields here.
                    rsDBRecords![Product Name] = rsCuratedTable![productName]
                    rsDBRecords![Lot Number] = rsCuratedTable![lotNumber]
                    rsDBRecords!counts = rsCuratedTable![counts]
                    rsDBRecords![subsets] = rsCuratedTable![subsets]
                    rsDBRecords![Date Taken] = rsCuratedTable![dateTaken]
                rsDBRecords.Update
                rsDBRecords.Bookmark = rsDBRecords.LastModified
                .MoveNext
            Loop
        End If
    End With

    rsCuratedTable.Close 'Close the recordset
    rsDBRecords.Close 'Close the recordset

Error_Handler_Exit:
    On Error Resume Next
    'Cleanup after ourselves
    Set rs = Nothing
    Set db = Nothing
    Exit Function

Error_Handler:
    MsgBox "MS Access has generated the following error" & vbCrLf & vbCrLf & "Error Number: " & _
    Err.Number & vbCrLf & "Error Source: IntegrateNIRData" & vbCrLf & "Error Description: " & _
    Err.Description, vbCritical, "An Error has Occured!"
    Resume Error_Handler_Exit

End Function

该函数挂在这一行,第二个 OpenRecordset:

Set rsDBRecords = db.OpenRecordset("NIR_Samples_verify", dbOpenDynaset, dbExecDirect, dbOptimisticValue)

据我了解,这可能与 Workspaces 和 Jet 引擎不接受跨越多个表的 ms 查询有关。当然,我也可能会走投无路。在这一点上的任何建议都会非常受欢迎。

更新:

你们中的一些人提出了类似的问题,所以我觉得我应该澄清以下几点:

1) NIR_Samples_verify 是一个 MS 访问选择查询,它从数据库中的几个表生成一个记录表。

2) 根据我在 OpenRecordset 方法中设置 RecordsetOptionEnum 和 LockTypeEnum 的内容,我不断收到两个错误。一是错误号 3027 数据库是只读的 二是错误号 3001 无效参数

3)据我了解,其余代码应该没问题,只是导致问题的 OpenRecordset 方法。

更新 2:

我在想也许访问不能做我想做的事。让我来说明一下。如果我有两个表都有主键,并且这些键在第三个表中引用,该表链接这两个表导致多对多关系,那么代码不仅需要将新数据添加到这两个表中,而且还在第三张表中生成适当的记录,以维护数据中的关系。希望从那以后。我确实很欣赏这些帮助和经验。

更新 3:

一直在网上搜索,发现如下:

这篇文章中它说查询仅在以下情况下可更新:1)它基于单个表。2)它基于基于单个表的查询。3) 它基于基于具有一对一关系的表的查询。

4

2 回答 2

1

不知道内容NIR_Samples_verify是什么,我会高度怀疑dbExecDirect

从帮助文件

dbExecDirect

“通过跳过 SQLPrepare 并直接调用 SQLExecDirect(仅限 ODBCDirect 工作区)运行查询。仅当您不基于参数查询打开记录集时才使用此选项。有关详细信息,请参阅“Microsoft ODBC 3.0 程序员参考”。“

我没有看到您提供任何参数。

- 编辑 -

通常我会像这样打开一个记录集

Set rsDBRecords = db.OpenRecordset("select bar from foo where bar > 10", _
                                    dbOpenDynaset, _
                                    dbSeeChanges)

(特别是如果我想更改数据初始化)

希望这会让你在你的项目中走得更远。

-- 编辑 2 --

听起来NIR_Samples_verify编辑起来很复杂。实际上,考虑到它是多个表的连接,Add它没有多大意义,Update在某些情况下可能有意义。

Your ultimate solution is really going to be doing multiple Adds on multiple record sets (one for each table being referenced in NIR_Samples_verify); much like if you were entering the data into the DB by hand. You add the records that aren't dependant on anything else first (remembering to grab keys to use in the dependant tables).

于 2012-07-19T18:01:09.083 回答
0

As it turns out my hunch was correct. The problem had to do with MS Access having updatable and non-updatble queries (See my edits of the question). The main problem was not only does Microsoft not make this information apparent, but there is no master list on their site either. Thank you everyone for the help. Feel free to see this article for more details.

于 2012-07-27T14:31:58.097 回答