"Opened exclusively be another user" 当通过 C# 从 CSV 中读取数据时

"Opened exclusively be another user" when reading data from CSV by C#

我是 运行 下面 asp.net 4.5 解决方案中的代码,它给了我错误:

The Microsoft Jet database engine cannot open the file ''. It is already opened exclusively by another user, or you need permission to view its data.

代码如下:

private static string FileConnectionString(string filePath)
{
    return string.Format(WebConfigurationManager.AppSettings["DataFileCSV"].ToString(), filePath);
}

string DataUploadFolder = WebConfigurationManager.AppSettings["DataFileUploadFolder"].ToString();
string filePath = HttpContext.Current.Server.MapPath(DataUploadFolder);

OleDbConnection fileConnection = new OleDbConnection(FileConnectionString(filePath));
try
{
    fileConnection.Open();
    string columnList = "Col1, Col2, Col3, Col4, Col5";
    DataTable fileDataTable = new DataTable();
    OleDbCommand command =  new OleDbCommand(string.Format("SELECT {0} FROM [{1}]",                                                                   
                                             columnList,
                                             FileUploadControl.FileName), 
                                fileConnection);
    OleDbDataAdapter da = new OleDbDataAdapter(command);
    da.Fill(fileDataTable); //Exception occurs here !!
}
catch (Exception ex)
{

}
finally
{
    fileConnection.Close();
}

Web.config:

 <add key="DataFileCSV" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='text;HDR=Yes;FMT=Delimited';" />

请注意,CSV 文件无法在任何地方打开。实际上没有文件打开,只有 Visual Studio 打开。我也可以打开文件,更改并保存它。 "Everyone" 对该文件具有 "full control" 权限。

我不明白错误发生的原因,找不到解决方法。看到很多页面都有这个错误,但到目前为止还没有解决方案。任何帮助将不胜感激。

编辑:在 aspx 中,我使用:<asp:FileUpload ID="FileUploadControl" runat="server" Width="400px" />

您的问题可能归结为异常处理不当。在示例代码中,您吞下了异常,不记录它们的内容并在致命的异常之后继续。其中任何一个都是异常处理的致命错误。我认为您的其余代码也有类似的问题。

这些类型的异常通常来自未正确关闭 FileHandles。 Wich 确实直接与异常处理相关联。所以我只能像以前一样link这两篇文章,希望您能按照他们的建议找到解决问题的方法:

在这个问题上折腾了一天,终于找到了解决办法。

需要执行两个步骤:

1- 通过使用 OleDBConnection,事实证明您无法从原始文件中读取,因为文件连接一打开,它就开始使用上传的文件。这促使我们将文件复制到另一个临时位置。所以在代码中添加检查行。

FileUploadControl.SaveAs(filePath + fileName); //This is the line
OleDbConnection fileConnection = new OleDbConnection(FileConnectionString(filePath, fileName));
fileConnection.Open();

它在做什么,我正在从我的桌面上传一个文件来读取数据,但应用程序先将它复制到另一个位置,然后从副本而不是原始位置读取数据。

2- 临时位置(文件夹)应该有 NETWORK SERVICE 作为用户。进入文件夹设置 -> 安全 -> 添加用户 -> 添加具有读写权限的网络服务。

那么,你就可以开始了。感谢@Bran 和@techturtle 在评论中启发了我。