间歇性问题 - OleDbConnection.Open()抛出System.Data.OleDb.OleDbException:未指定的错误

时间:2012-11-30 16:18:32

标签: asp.net excel ado.net oledb

我们组织中的生产应用程序使用Excel 2003文件通过Web应用程序处理用户提交的数据。此应用程序大多数时间都可靠地运行。最近,当调用OleDbConnection.Open()方法时,应用程序已经开始间歇性地抛出“System.Data.OleDb.OleDbException:Unspecified error”。错误一直持续到应用程序池被回收,此时一切都按预期再次运行。在Windows应用程序事件日志中没有捕获任何错误。

ASP.NET Web应用程序托管在Windows Server 2003 32位计算机上的WSS 3.0中的Web部件中。该应用程序旨在防止任何并发问题。系统功能ID是唯一可以访问临时文件存储的帐户,并且内置了一些机制,以确保在使用唯一命名约定和上载跟踪子系统处理期间,另一个上载不会覆盖该文件。

非常感谢任何见解。

我们使用以下代码从Excel 2003文件中检索数据:

public static DataTable GetWorksheetData(string filePath)
{
    OleDbConnectionStringBuilder builder = new OleDbConnectionStringBuilder { DataSource = filePath };
    builder.Provider = "Microsoft.Jet.OLEDB.4.0";
    builder["Extended Properties"] = "Excel 8.0;IMEX=1;HDR=YES";

    DataTable table = new DataTable();
    try
    {
        // Creates an OleDbConnection for the excel file
        using (OleDbConnection connection = new OleDbConnection(builder.ConnectionString))
        {
            connection.Open();
            string sheetName = GetWorksheet(connection, "Template");
            if (!string.IsNullOrEmpty(sheetName))
            {
                using (OleDbCommand command = connection.CreateCommand())
                {
                    try
                    {
                        command.CommandText = string.Format("SELECT * FROM [{0}]", sheetName);

                        using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                        using (DataSet dataSet = new DataSet())
                        {
                            adapter.Fill(dataSet);
                                table = dataSet.Tables[0];
                        }
                    }
                    finally
                    {
                        connection.Close();
                    }
                }
            }
            else
            {
                throw new InvalidWorksheetException();
            }
        }
    }
    catch (Exception ex)
    {
        Logger.Write(LogMsgSeverity.Error, ex);
        throw;
    }
    return table;
}


private static string GetWorksheet(OleDbConnection connection, string sheetName)
{
    string validSheetName = string.Empty;
    using (DataTable tables = connection.GetSchema("Tables"))
    {
        DataRowCollection rows = tables.Rows;

        if (rows.Count > 0)
        {
            foreach (DataRow row in rows)
            {
                if (row["Table_Name"].ToString().Contains(sheetName))
                {
                    validSheetName = sheetName;
                }
            }
        }
    }
    return validSheetName;
}

0 个答案:

没有答案