[英]Creating a Query with CreateQueryDef Failing due to table/object being read only
我修改了一段代碼,從一行 SQL 代碼中創建了一個查詢,並將其導出到一個文本文件中。
我以前有這個工作,但是在嘗試在一個更大的子程序中實現它之后,它現在給出一個錯誤,指出表/對象不能被更新,因為它是只讀的(錯誤 3027)。
無論代碼是自己執行還是從其他代碼中執行,都會發生這種情況。
請在下面找到導出代碼:
Public Sub exportQuery(exportSQL As String, FileName As String)
Dim db As DAO.Database, qd As DAO.QueryDef
Dim i As Integer
Dim InitialFileName As String
Set db = CurrentDb
'Check to see if querydef exists and delete it if it exists
For i = 0 To (db.QueryDefs.Count - 1)
If db.QueryDefs(i).Name = "tmpExport" Then
db.QueryDefs.Delete ("tmpExport")
Debug.Print "Deleted"
Exit For
End If
Next i
Debug.Print "This far"
Set qd = db.CreateQueryDef("tmpExport", exportSQL)
'Set intial filename to default if none is chosen
If (FileName <> "") Then
InitialFileName = "export_" & Format(Date, "mmddyyy") & ".csv"
Else
InitialFileName = FileName
End If
'Write the query results to a File
DoCmd.TransferText transferType:=acExportDelim, TableName:="tmpExport", FileName:="Pathtoexport\Export" & InitialFileName, HasFieldNames:=False
'Cleanup
db.QueryDefs.Delete "tmpExport"
db.Close
Set db = Nothing
Set qd = Nothing
Debug.Print "ExportQuery" & vbCrLf
End Sub
另請在下面找到有問題的 SQL:
Select phone_number FROM Master WHERE list_id IN ('230');
主表既存在又未在 Access 中打開。
SQL 有效並在手動應用時產生結果。
tmpExport
查詢在運行代碼之前不存在。
該代碼似乎在創建查詢時失敗。
如果有人能闡明造成這種情況的原因,我將不勝感激。
正如韋恩在評論中正確指出的那樣,代碼中存在的以下if
語句中實現的邏輯是相反的:
'Set intial filename to default if none is chosen
If (FileName <> "") Then
InitialFileName = "export_" & Format(Date, "mmddyyy") & ".csv"
Else
InitialFileName = FileName
End If
以上暗示有效的文件名將導致 output 路徑:
Pathtoexport\Export
您還應該在此處省略括號:
db.QueryDefs.Delete ("tmpExport")
但是,從更大的角度來看,我個人會避免在此 function 中構建文件路徑,並選擇提供完整的文件路徑作為參數。
這樣,function 的用途只有一個:
“將提供的 SQL 的結果導出到具有提供的文件名的文件。”
而且您不再需要將父文件夾硬編碼到 function 中。
例如,類似於以下內容:
Function ExportQuery(sql As String, fnm As String)
Dim qry As String: qry = "tmpExport"
Dim dbs As DAO.Database
Set dbs = CurrentDb
On Error Resume Next
dbs.QueryDefs.Delete qry
On Error GoTo 0
dbs.CreateQueryDef qry, sql
DoCmd.TransferText acExportDelim, , qry, fnm, False
dbs.QueryDefs.Delete qry
Set dbs = Nothing
End Function
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.