我是一名开发人员,帮助维护在IIS7中以64位模式在Server 2008 r2上运行的Classic-ASP / VBScript编写的相当大的在线应用程序。
其中一项功能要求最终用户导入CSV文件,并且由于将此系统移至64位环境,我们将代码更改为使用http://www.microsoft.com/en-us/download/details.aspx?id=13255中的“Microsoft Access文本驱动程序”,因为这些工作正常在64位应用程序上。
这一切都运行正常但是,最近我们遇到了一些导入问题,其中列中的数据在被读作文本时被解释为数字。这最终意味着在这些列中,纯文本值将返回为NULL。
更好地格式化CSV并确保字符串用双引号括起来确实解决了这个问题,但考虑到这个文件是由最终用户提供的,这些最终用户可能没有理解/专业知识来进行这些更改,所以它真的不可行生产解决方案。
我们首选的解决方案是让文本驱动程序将这些混合内容列视为文本但是我无法找到实现此目的的解决方案。
我考虑过/试过以下......
我考虑使用schema.ini文件但是对于此特定导入,我们无法在读取CSV之前知道列名称/顺序,因为我们为最终用户提供了将数据重新映射到我们预期的列不匹配时。
我曾尝试使用IMEX = 1属性来处理混合数据类型,但它似乎没有任何影响。我在JET驱动程序中取得了成功,但是64位系统这不是一个选项。我相对确信这个问题不在MaxScanRows中,因为第一行数据包含纯文本值。
以下是我们的代码摘录,它试图使用IMEX解决问题。
' The following variables are defined earlier in the code
' however I am showing them here for clarity
environmentTextDriver = "Microsoft Access Text Driver (*.txt, *.csv)"
folderName = "/_uploads/offline"
fileName = import_xxx.csv ' Dynamic file name
' Open text database
Set DBText = Server.CreateObject("ADODB.Connection")
DBText.Provider = "MSDASQL"
DBText.ConnectionString = "Driver={" & environmentTextDriver & "};Extended Properties=""text;HDR=Yes;IMEX=1"";Dbq=" & Server.MapPath(folderName) & ";Extensions=csv;"
' I have also tried the following connection string
' DBText.ConnectionString = "Driver={" & environmentTextDriver & "};HDR=Yes;IMEX=1;Dbq=" & Server.MapPath(folderName) & ";Extensions=csv;"
DBText.Open
' Set query
strSQL = "SELECT * FROM " & fileName & ";"
Set rs = DBText.Execute(strSQL)
if not rs.EOF then
arrResponse = rs.getRows()
' Debug, print out results for error column
for i = 0 to uBound(arrResponse,2)
response.write arrResponse(18, i) & "&"
next
end if
rs.close : set rs = nothing
' Close database
DBText.close : set DBText = nothing
我希望我只是做一些愚蠢的事情,而不是微软Access文本驱动器不支持它。非常感谢任何帮助。
此致
尼克