保留导入数据的关系

时间:2012-07-19 17:44:33

标签: vba ms-access ms-access-2010

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

为此,我一直在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:

一直在网上搜索并找到以下内容:

来自this post它表示查询只有在以下情况下才可更新: 1)它基于单个表。 2)它基于基于单个表的查询。 3)它基于基于具有一对一关系的表的查询。

1 个答案:

答案 0 :(得分:1)

不知道NIR_Samples_verify的内容是什么,我对dbExecDirect

非常怀疑

来自帮助文件

dbExecDirect

  

“通过跳过SQLPrepare并直接调用来运行查询   SQLExecDirect(仅限ODBCDirect工作空间)。仅在使用此选项时   您没有根据参数查询打开Recordset。更多   信息,请参阅“Microsoft ODBC 3.0程序员参考”。 “

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

- 编辑 -

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

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

(特别是如果我想改变数据init)

希望这会让你在项目中更进一步。

- 编辑2 -

听起来NIR_Samples_verify很难编辑。实际上,鉴于它是多个表的连接,在Add上执行Update没有多大意义,并且在某些情况下NIR_Samples_verify可能有意义。

您的最终解决方案实际上是在多个记录集上进行多次添加({{1}}中引用的每个表都有一个);就像你手动将数据输入数据库一样。您首先添加不依赖于任何其他内容的记录(记住要获取要在依赖表中使用的密钥)。