Microsoft Jet数据库引擎无法打开文件'。它已由其他用户独占打开,或者您需要获得查看其数据的权限。

时间:2014-06-30 07:14:55

标签: c# asp.net asp.net-mvc oledb oledbconnection

我正在使用OLEDB服务器在我的ASP.NET MVC项目中读取excel文件。然后我得到错误 " Microsoft Jet数据库引擎无法打开文件'。它已由其他用户独占打开,或者您需要获得查看其数据的权限#34;。具有不同的CSV文件的连接字符串的相同代码工作正常但是对于Excel connectionString我收到此错误。有没有人知道这个问题的解决方案。

我的代码是:

public JsonResult ImportCSVFiles()
        {

            HttpPostedFileBase hpf = null;
            foreach (string file in Request.Files)
            {
                hpf = Request.Files[file] as HttpPostedFileBase;
            }
            string[] FileName;
            string filename = hpf.FileName;

            string DestinationPath = Server.MapPath("..") + "\\CSVFiles\\";

            if (!Directory.Exists(DestinationPath))
            {
                Directory.CreateDirectory(DestinationPath);

                if (System.IO.File.Exists(Server.MapPath("..") + "\\CSVFiles\\" + filename) == false)
                {
                    hpf.SaveAs(DestinationPath + filename);
                }
                else
                {
                    System.IO.File.Delete(Server.MapPath("..") + "\\CSVFiles\\" + filename);
                    hpf.SaveAs(DestinationPath + filename);
                }

            }
            else
            {

                if (System.IO.File.Exists(Server.MapPath("..") + "\\CSVFiles\\" + filename) == false)
                {
                    hpf.SaveAs(DestinationPath + filename);
                }
                else
                {
                    System.IO.File.Delete(Server.MapPath("..") + "\\CSVFiles\\" + filename);
                    hpf.SaveAs(DestinationPath + filename);
                }
            }

            bool isFirstRowHeader = true;
            string header = isFirstRowHeader ? "Yes" : "No";
            string path = "";
            string pathOnly = Path.GetDirectoryName(DestinationPath);
            string fileName = Path.GetFileName(DestinationPath + "\\" + filename);


            string sql = @"SELECT * FROM [" + fileName + "]";

            //using (OleDbConnection connection = new OleDbConnection(
            //          @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
            //          ";Extended Properties=\"Text;HDR=" + header + "\""))

            using (OleDbConnection connection = new OleDbConnection(
                  @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
                  ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";"))


            using (OleDbCommand command = new OleDbCommand(sql, connection))
            using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
            {
                DataTable dataTable = new DataTable();

                dataTable.Locale = CultureInfo.CurrentCulture;
                adapter.Fill(dataTable);
            }
}

评论的连接字符串用于CSV文件,CSV文件可以正常使用相同的代码。

1 个答案:

答案 0 :(得分:0)

我最近处理的程序遇到了同样的问题。我的解决方案是简单地从连接字符串中取出额外的位。我不知道它为什么有用但是因为它适用于我,它可能适合你。这是您的新连接字符串的样子:

using (OleDbConnection connection = new OleDbConnection(
              @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + ";"))

你实际上可能只能保留HDR = Yes位,因为我知道您可能需要告诉它有标题,我不认为留下它会影响它。