簡體   English   中英

由於表/對象為只讀,使用 CreateQueryDef 創建查詢失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM