2014-10-03 128 views
1

我试图导出动态SQL语句的结果,但不断收到错误3027“无法更新。数据库或对象是只读的。”。我使用Access 2003. GetYearFromDirName(sFolder)从目录结构中解析出一年,并将其用作SQL结果中的计算列。TransferSpreadSheet给出错误3027“无法更新,数据库或对象是只读的。”

这里是有问题的代码:

sSQL = "SELECT INDEXDB1.IFIELD1 AS TestArea, INDEXDB1.IFIELD2 AS TSID, INDEXDB1.IFIELD3 AS MapCoord, " _ 
    & "INDEXDB1.IFIELD4 AS Community, INDEXDB1.IFIELD5 AS Address, INDEXDB1.IFIELD6 AS DocNum, " _ 
    & "'" & GetYearFromDirName(sFolder) & "' AS Yr FROM INDEXDB1;" 

'DoCmd.TransferSpreadsheet acExport, , sSQL, sFolder & "\" & BoxNum & ".csv" 
'DoCmd.OutputTo acOutputQuery, "ExportRecs", acFormatXLS, sFolder & "\" & BoxNum & ".csv" 

SaveToExcel sSQL, sFolder & "\" & BoxNum & ".csv" 

电话:

Public Sub SaveToExcel(strSQL As String, strFullFileName As String) 
Dim strQry As String 
Dim db As Database 
Dim Qdf As QueryDef 

On Error GoTo SaveToExcel_err 

strQry = "TempQueryName" 

Set db = CurrentDb 
'Set Qdf = db.CreateQueryDef(strQry, strSQL) 

'DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, strQry, strFullFileName, True 

'DoCmd.DeleteObject acQuery, strQry 

With db 
    ' Create permanent QueryDef. 
    Set Qdf = .CreateQueryDef(strQry, strSQL) 
    ' Open Recordset and print report. 
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel3, strQry, strFullFileName, True 
    ' Delete new QueryDef because this is a demonstration. 
    .QueryDefs.Delete Qdf.Name 
    .Close 
End With 


Exit Sub 

SaveToExcel_err: 
    MsgBox Error & " " & Err & " in sub SaveToExcel. Close program and start over." 

End Sub 

有没有更好的方式来导出动态SQL语句的结果?最后,我需要一个CSV文件。

回答

1

您可以在Excel中打开它,但CSV是文本格式,所以您需要使用DoCmd.TransferText而不是DoCmd.TransferSpreadsheet。使用导出数据向导手动进行一次导出。在你这样做的时候,你将会创建并命名一个Export Specification。这将指定逗号作为分隔符和双引号作为文本分隔符。您创建的导出规范的名称作为第二个参数传递给TransferText

+0

这是一个很好的建设性的评论,指出我的代码存在一个真正的问题。不幸的是,导出文件的名称也是动态的,所以我无法使用它。 – Barry 2014-10-06 17:54:24

+0

我结束了循环使用文本文件编写API的记录集。 – Barry 2014-10-06 17:55:03

相关问题