我是否又破坏了 Access 数据库引擎?
在针对另一个 stackoverflow 答案测试以下 SQL 代码时,我得到了以下错误:
- mdb 通过 OLE DB:“灾难性的 失败”
- accdb 通过 OLE DB:(空白消息)
- Access2007 查询对象:“未知 访问数据库错误”
我正在使用新的干净数据库文件。 showplan.out 执行计划不包含任何有用的内容;我已发布以下内容。
除了声明 Access 数据库引擎不适合用途之外 (!!),我能做些什么吗?
Sub Discon()
Const USE_MDB As Long = 1
Const USE_ACCDB As Long = 2
Dim version As Long
' Hard code which version of the
' Access Database Engine to use
version = USE_MDB
Dim fullFileName As String
Dim conString As String
If version = USE_MDB Then
fullFileName = Environ$("temp") & "\DropMe.mdb"
conString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & fullFileName
Else
fullFileName = Environ$("temp") & "\DropMe.accdb"
conString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & fullFileName
End If
On Error Resume Next
Kill fullFileName
On Error GoTo 0
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
' Create a new database file in user's temp folder
.Create conString
With .ActiveConnection
Dim Sql As String
' Create a new base base with data (required to
' be able to later create a virtual table)
Sql = _
"CREATE TABLE Customers (" & _
"CustomerID CHAR(5) NOT NULL UNIQUE);"
.Execute Sql
Sql = _
"INSERT INTO Customers (CustomerID)" & _
" VALUES ('ANTON');"
.Execute Sql
' Create a virtual (viewed) table
Sql = _
"CREATE VIEW TableA AS " & _
"SELECT DT1.ID, DT1.[Date], DT1.Supplier_ID " & _
"FROM ( " & _
" SELECT DISTINCT 1 AS ID, '2009-10-23 00:00:00' AS [Date], " & _
" 1 AS Supplier_ID FROM Customers " & _
" UNION ALL " & _
" SELECT DISTINCT 2, '2009-10-23 00:00:00', 1 FROM Customers" & _
" UNION ALL " & _
" SELECT DISTINCT 3, '2009-10-24 00:00:00', 2 FROM Customers " & _
" UNION ALL " & _
" SELECT DISTINCT 4, '2009-10-25 00:00:00', 2 FROM Customers " & _
" UNION ALL " & _
" SELECT DISTINCT 5, '2009-10-26 00:00:00', 1 FROM Customers " & _
" ) AS DT1;"
.Execute Sql
' Create VIEWs based on the virtual table
Sql = _
"CREATE VIEW TableA_StartDates (Supplier_ID, start_date) " & _
"AS " & _
"SELECT T1.Supplier_ID, T1.[Date] " & _
" FROM TableA AS T1 " & _
" WHERE NOT EXISTS ( " & _
" SELECT * " & _
" FROM TableA AS T2 " & _
" WHERE T2.Supplier_ID = T1.Supplier_ID " & _
" AND DATEADD('D', -1, T1.[Date]) = T2.[Date] " & _
" );"
.Execute Sql
Sql = _
"CREATE VIEW TableA_EndDates (Supplier_ID, end_date) " & _
"AS " & _
"SELECT T3.Supplier_ID, T3.[Date] " & _
" FROM TableA AS T3 " & _
" WHERE NOT EXISTS ( " & _
" SELECT * " & _
" FROM TableA AS T4 " & _
" WHERE T4.Supplier_ID = T3.Supplier_ID " & _
" AND DATEADD('D', 1, T3.[Date]) = T4.[Date] " & _
" );"
.Execute Sql
Sql = _
"CREATE VIEW TableA_Periods (Supplier_ID, start_date, end_date) " & _
"AS " & _
"SELECT DISTINCT T5.Supplier_ID, " & _
" ( " & _
" SELECT MAX(S1.start_date) " & _
" FROM TableA_StartDates AS S1 " & _
" WHERE S1.Supplier_ID = T5.Supplier_ID " & _
" AND S1.start_date <= T5.[Date] " & _
" ), " & _
" ( " & _
" SELECT MIN(E1.end_date) " & _
" FROM TableA_EndDates AS E1 " & _
" WHERE E1.Supplier_ID = T5.Supplier_ID " & _
" AND T5.[Date] <= E1.end_date " & _
" ) " & _
" FROM TableA AS T5;"
.Execute Sql
' Attempt to use the nested VIEWs in a query
Sql = _
"SELECT * FROM TableA_Periods AS P1;"
Dim rs
On Error Resume Next
Set rs = .Execute(Sql)
If Err.Number = 0 Then
MsgBox rs.GetString
Else
MsgBox _
Err.Number & ": " & _
Err.Description & _
" (" & Err.Source & ")"
End If
On Error GoTo 0
End With
Set .ActiveConnection = Nothing
End With
End Sub
这是 showplan.out 的内容:
--- temp query ---
- Inputs to Query -
- End inputs to Query -
01) Insert into 'Customers'
--- temp query ---
- Inputs to Query -
- End inputs to Query -
01) Insert into 'Customers'
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
05) Restrict rows of result of 04)
by scanning
testing expression "Not "
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
05) Restrict rows of result of 04)
by scanning
testing expression "Not "
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
05) Restrict rows of result of 04)
by scanning
testing expression "Not "
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
05) Restrict rows of result of 04)
by scanning
testing expression "Not "
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
store result in temporary table
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
store result in temporary table
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
store result in temporary table
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
store result in temporary table
While testing the below SQL code for another stackoverflow answer, I got the following errors:
- mdb via OLE DB: "Catastrophic
failure" - accdb via OLE DB: (blank message)
- Access2007 Query object: "Unknown
Access Database Error"
I'm using a new clean database file. The showplan.out execution plan doesn't contain anything useful; I've posted the contents below.
Other than declaring the Access Database Engine unfit for purpose (!!), is there anything I can do?
Sub Discon()
Const USE_MDB As Long = 1
Const USE_ACCDB As Long = 2
Dim version As Long
' Hard code which version of the
' Access Database Engine to use
version = USE_MDB
Dim fullFileName As String
Dim conString As String
If version = USE_MDB Then
fullFileName = Environ$("temp") & "\DropMe.mdb"
conString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & fullFileName
Else
fullFileName = Environ$("temp") & "\DropMe.accdb"
conString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & fullFileName
End If
On Error Resume Next
Kill fullFileName
On Error GoTo 0
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
' Create a new database file in user's temp folder
.Create conString
With .ActiveConnection
Dim Sql As String
' Create a new base base with data (required to
' be able to later create a virtual table)
Sql = _
"CREATE TABLE Customers (" & _
"CustomerID CHAR(5) NOT NULL UNIQUE);"
.Execute Sql
Sql = _
"INSERT INTO Customers (CustomerID)" & _
" VALUES ('ANTON');"
.Execute Sql
' Create a virtual (viewed) table
Sql = _
"CREATE VIEW TableA AS " & _
"SELECT DT1.ID, DT1.[Date], DT1.Supplier_ID " & _
"FROM ( " & _
" SELECT DISTINCT 1 AS ID, '2009-10-23 00:00:00' AS [Date], " & _
" 1 AS Supplier_ID FROM Customers " & _
" UNION ALL " & _
" SELECT DISTINCT 2, '2009-10-23 00:00:00', 1 FROM Customers" & _
" UNION ALL " & _
" SELECT DISTINCT 3, '2009-10-24 00:00:00', 2 FROM Customers " & _
" UNION ALL " & _
" SELECT DISTINCT 4, '2009-10-25 00:00:00', 2 FROM Customers " & _
" UNION ALL " & _
" SELECT DISTINCT 5, '2009-10-26 00:00:00', 1 FROM Customers " & _
" ) AS DT1;"
.Execute Sql
' Create VIEWs based on the virtual table
Sql = _
"CREATE VIEW TableA_StartDates (Supplier_ID, start_date) " & _
"AS " & _
"SELECT T1.Supplier_ID, T1.[Date] " & _
" FROM TableA AS T1 " & _
" WHERE NOT EXISTS ( " & _
" SELECT * " & _
" FROM TableA AS T2 " & _
" WHERE T2.Supplier_ID = T1.Supplier_ID " & _
" AND DATEADD('D', -1, T1.[Date]) = T2.[Date] " & _
" );"
.Execute Sql
Sql = _
"CREATE VIEW TableA_EndDates (Supplier_ID, end_date) " & _
"AS " & _
"SELECT T3.Supplier_ID, T3.[Date] " & _
" FROM TableA AS T3 " & _
" WHERE NOT EXISTS ( " & _
" SELECT * " & _
" FROM TableA AS T4 " & _
" WHERE T4.Supplier_ID = T3.Supplier_ID " & _
" AND DATEADD('D', 1, T3.[Date]) = T4.[Date] " & _
" );"
.Execute Sql
Sql = _
"CREATE VIEW TableA_Periods (Supplier_ID, start_date, end_date) " & _
"AS " & _
"SELECT DISTINCT T5.Supplier_ID, " & _
" ( " & _
" SELECT MAX(S1.start_date) " & _
" FROM TableA_StartDates AS S1 " & _
" WHERE S1.Supplier_ID = T5.Supplier_ID " & _
" AND S1.start_date <= T5.[Date] " & _
" ), " & _
" ( " & _
" SELECT MIN(E1.end_date) " & _
" FROM TableA_EndDates AS E1 " & _
" WHERE E1.Supplier_ID = T5.Supplier_ID " & _
" AND T5.[Date] <= E1.end_date " & _
" ) " & _
" FROM TableA AS T5;"
.Execute Sql
' Attempt to use the nested VIEWs in a query
Sql = _
"SELECT * FROM TableA_Periods AS P1;"
Dim rs
On Error Resume Next
Set rs = .Execute(Sql)
If Err.Number = 0 Then
MsgBox rs.GetString
Else
MsgBox _
Err.Number & ": " & _
Err.Description & _
" (" & Err.Source & ")"
End If
On Error GoTo 0
End With
Set .ActiveConnection = Nothing
End With
End Sub
This is the contents of showplan.out:
--- temp query ---
- Inputs to Query -
- End inputs to Query -
01) Insert into 'Customers'
--- temp query ---
- Inputs to Query -
- End inputs to Query -
01) Insert into 'Customers'
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
05) Restrict rows of result of 04)
by scanning
testing expression "Not "
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
05) Restrict rows of result of 04)
by scanning
testing expression "Not "
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
05) Restrict rows of result of 04)
by scanning
testing expression "Not "
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
05) Restrict rows of result of 04)
by scanning
testing expression "Not "
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
store result in temporary table
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
store result in temporary table
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
store result in temporary table
--- temp query ---
- Inputs to Query -
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
Table 'Customers'
- End inputs to Query -
store result in temporary table
store result in temporary table
01) Union result of '00)' and result of '00)'
store result in temporary table
02) Union result of '01)' and result of '01)'
store result in temporary table
03) Union result of '02)' and result of '02)'
store result in temporary table
04) Union result of '03)' and result of '03)'
store result in temporary table
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
声明 Access 数据库引擎不适合其用途 (!!)。这些是普通查询,应该可以正常工作而不会出现错误。
Declare the Access Database Engine unfit for purpose (!!). These are vanilla queries and should work without error.