0

ユーザーが Excel ドキュメントをアップロードするページがあります。ドキュメントにはメンバー情報が含まれており、送信後、ファイルの内容が SQL Server テーブルに含まれるメンバー データを置き換える必要があります。

fileUploaderコードを追加した後、どのように例外が発生しますか。

if (fileUploader.HasFile)
{
     string contentType = fileUploader.PostedFile.ContentType;
     // Excel 2007 || Excel 2003
     if (contentType.Equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") || contentType.Equals("application/vnd.ms-excel"))
     {
        hidePanels();
        Members members = new Members();
        if (members.getAllNotExportedMembers().Count > 0)
        {
           //error message
        }
        else
        {
           bool backupSucceed =
                        members.backUpDatabase(Server.MapPath("~/backup-db") + @"\db-backup-" +
                                               DateTime.Now.ToString().Replace("/", "-").Replace(":", "-") + ".bak");
           if (backupSucceed)
           {
               bool fileUploaded = Helper.saveFile(fileUploader.FileBytes,
                                                            Server.MapPath("~/admin/kar/"),
                                                            fileUploader.FileName, 1, User.Identity.Name);
                if (fileUploaded)
                {
                     bool truncateSucceed = members.truncateTable();
                     if (truncateSucceed)
                     {
                        importExcel(Server.MapPath("~/admin/kar/"), "2012.xlsx");
                     }
                }
            }
        }
     }
}

以下を除くすべてをコメントアウトした場合:

bool truncateSucceed = members.truncateTable();
if (truncateSucceed)
{
    importExcel(Server.MapPath("~/admin/kar/"), "2012.xlsx");
    showSuccesPanel("Success");
}

正常に動作し、例外は発生しません。

例外:

System.Data.OleDb.OleDbException (0x80004005): 外部テーブルが予期された形式ではありません。
System.Data.OleDb.OleDbConnectionInternal..ctor (OleDbConnectionString コンストラクター、OleDbConnection 接続)
で System.Data.OleDb.OleDbConnectionFactory.CreateConnection (DbConnectionOptions オプション、オブジェクト poolGroupProviderInfo、DbConnectionPool プール、DbConnection owningObject)
で System.Data.ProviderBase.DbConnectionFactory で。
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)での CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) で
System.Data.OleDb.OleDbConnection.Open()
で admin.admin_uploadMemberList.importExcel(String filePath, String fileName) で uploadMemberList.aspx.cs:line 91

OleDB 接続文字列:

string conn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + fileName
+ @";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0""";

どうすればいいの?

4

1 に答える 1

0

問題の原因がわかりました。これは saveFile メソッドが原因でした。ファイルをアップロードしていて、同じ名前のファイルが既に存在していた場合、例外がスローされました。

public static bool saveFile(this Byte[] fileBytes, string filePath, string fileName, int category, string uploadedBy)
{
    try
    {
        FileStream fileStream = new FileStream(filePath + "/" + fileName, FileMode.Create, FileAccess.ReadWrite);
        fileStream.Write(fileBytes, 0, fileBytes.Length);
        fileStream.Dispose();
        fileStream.Close();
        FileUpload fileUpload = new FileUpload();
        return fileUpload.createFileUpload(fileName, category, filePath, uploadedBy, DateTime.Now);
    }
    catch (Exception ex)
    {
        mLog.logMessage(ex, HttpContext.Current.Request.Url.ToString(), 1);
        return false;
    }
}

必要に応じてファイルを上書きするだけですが、例外が発生する理由を誰かが説明できるかもしれません。

于 2012-08-02T22:27:50.193 に答える