由于表/对象是只读的,因此创建CreateQueryDef失败的查询

问题描述 投票:0回答:1

我修改了一段代码以从一行SQL代码创建一个Query并将其导出到文本文件。

我以前有这项工作,但是尝试在更大的子例程中实现后,现在出现错误,指出表/对象由于是只读而无法更新(错误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查询在运行代码之前不存在。

  • 该代码似乎在创建查询时失败。

如果有人能弄清是什么原因,我将非常感激。

sql vba ms-access access-vba export-to-csv
1个回答
0
投票

正如韦恩在注释中正确指出的那样,代码中以下if语句中实现的逻辑是相反的:

'Set intial filename to default if none is chosen
If (FileName <> "") Then
    InitialFileName = "export_" & Format(Date, "mmddyyy") & ".csv"
Else
    InitialFileName = FileName   
End If

以上暗示有效的文件名将导致输出路径:

Pathtoexport\Export

您还应该在此处省略括号:

db.QueryDefs.Delete ("tmpExport")

但是,从更大的角度看,我个人将避免在此函数中构造文件路径,而是选择提供完整的文件路径作为参数。

这样,该功能具有单一用途:

“将提供的SQL的结果导出到具有提供的文件名的文件。”

并且您将不再需要将父文件夹硬编码到函数中。

例如,类似以下内容:

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
© www.soinside.com 2019 - 2024. All rights reserved.