C# 将Excel数据导入SQL Server时出现异常

C# 将Excel数据导入SQL Server时出现异常,c#,sql-server,excel,C#,Sql Server,Excel,我有一个用户上传Excel文档的页面。文档包含成员信息,提交后,文件内容应替换SQL Server表中包含的成员数据 不管怎样,在我添加了文件上传程序之后,代码都会导致异常 if (fileUploader.HasFile) { string contentType = fileUploader.PostedFile.ContentType; // Excel 2007 || Excel 2003 if (contentType.Equals("applicatio

我有一个用户上传Excel文档的页面。文档包含成员信息,提交后,文件内容应替换SQL Server表中包含的成员数据

不管怎样,在我添加了文件上传程序之后,代码都会导致异常

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");
}
它正常工作,不会导致异常

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");
                     }
                }
            }
        }
     }
}
例外情况:

System.Data.OleDb.OLEDBEException 0x80004005:外部表未采用预期格式。 位于System.Data.OleDb.OleDbConnectionInternal..ctorOleDbConnectionString 构造,OLEDB连接 在System.Data.OleDb.OleDbConnectionFactory.CreateConnectionDbConnectionOptions中 选项、对象池组ProviderInfo、数据库连接池池、, DbConnection owningObject 位于System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnectionDbConnection owningConnection,DbConnectionPoolGroup poolGroup 位于System.Data.ProviderBase.DbConnectionFactory.GetConnectionDbConnection 所有权连接 在System.Data.ProviderBase.DbConnectionClosed.OpenConnectionDbConnection 外部连接,数据库连接工厂连接工厂 在System.Data.OleDb.OleDbConnection.Open处 在admin.admin_uploadMemberList.importExcelString文件路径中,uploadMemberList.aspx.cs中的字符串文件名:第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""";

这怎么可能呢?

好吧,我找到了导致问题的原因。这是由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;
    }
}

它只是按它应该的方式覆盖了文件-但也许有人可以解释为什么我会出现异常。

顺便说一句,您的连接字符串中的TypeGuessRows中缺少T。@Bridge谢谢,只是编辑错误: