有点像一个罗嗦的标题,但我有一个经典的ASP应用程序我试图写一个用户上传Excel电子表格然后我拿这个电子表格并将数据导入SQL。
我的一切都运行得很好,但我遇到的一件事是,在我使用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;"
答案 0 :(得分:1)
我实际上已经找到了很多方法来做到这一点。
如您OP的评论中所述,一种选择是使用SSIS并使用存储过程导入Excel电子表格。
或使用支票来测试whether the file is locked