在解释我的代码问题之前,我将从背景故事开始。我正在使用 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) 它基于基于具有一对一关系的表的查询。