使用ODBC在经典ASP中关闭与Excel电子表格的连接
问题描述:
有点啰嗦的标题,但我有一个经典的ASP应用程序我想写一个用户上传Excel电子表格的位置,然后将该电子表格导入到SQL中。使用ODBC在经典ASP中关闭与Excel电子表格的连接
我有一切工作很好,但我遇到的一件事是,我打开电子表格使用ODBC并关闭所有引用它的对象后,如果我尝试删除该文件,我得到一个权限被拒绝的错误。
如果我在上传前尝试扫描临时目录,并遇到以前上传的文件(比如说在最近两分钟内),我会得到权限被拒绝的错误。
如果我等了一两分钟,似乎无论锁上哪个文件被释放,我可以删除它。
下面是一些代码:
sPath = Server.MapPath("/_temp/") & "\"
sFileName = Request.QueryString("filename")
Set objFile = Server.CreateObject("Scripting.FileSystemObject")
If objFile.FileExists(sPath & sFileName) Then
objFile.DeleteFile sPath & sFileName, True
End If
'Upload file occurs here
sConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & sPath & sFileName & ";"
adLockOptimistic = 3
sSQL = "SELECT * "
sSQL = sSQL & "FROM Range"
Set rsSystem = objExcel.Execute(sSQL)
'Do stuff
rsSystem.Close
Set rsSystem = Nothing
objExcel.Close
Set objExcel = Nothing
Set objFile = Nothing
似乎并不重要,如果我尝试之前或之后,我做进口,如果我尝试删除该文件导入成功之后,我得到删除文件权限被拒绝,但如果我等一会儿,我就可以删除它。
这是一个问题,因为用户将被提供模板,他们可能会更正并立即重新上传。
关于为什么当我关闭所有关联的对象时没有立即释放锁的任何想法?
谢谢!
编辑:
更改为使用不同的驱动程序连接字符串似乎做的伎俩,现在当我关闭的对象,我可以没有问题
sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPath & sFileName & ";Extended Properties=Excel 8.0;"
答
我已经删除的文件实际上找到了很多方法来做到这一点。
正如您的OP的评论中所述,一种选择是使用SSIS并使用存储过程导入您的Excel电子表格。
或者用支票来测试whether the file is locked
SQL我们谈论哪些呢?如果它是SQL Server,那么为什么不使用DTS(2000)或SSIS(2005+)? – Paul 2014-09-30 08:55:56
SQL Server。该规范适用于用户从浏览器上载Excel电子表格,查看中间页面电子表格中的内容,验证并导入到表格中。不确定SSIS是最好的,还是它? – Tom 2014-09-30 14:50:36
我不明白为什么不这样做 - 您可以在文件上传后从Excel电子表格导入,然后删除文件,节省一大块空间。 – Paul 2014-09-30 14:56:28