2

私たちの組織の運用アプリケーションは、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;
}
4

0 に答える 0