OleDbDataAdapter.Fill(DataTable)无法处理大的xls文件大小

时间:2013-10-27 09:22:05

标签: c# excel dataadapter oledbdataadapter

我正在尝试获取DataTable,读取.xls文件。 如果我使用大小为25kb的.xls文件运行下面的代码,它工作正常,但如果我加载一个更大的文件(7,52MB),它不起作用。

string filenamePath = System.IO.Path.Combine(Server.MapPath("/Uploads"), FileUpload1.FileName);
FileUpload1.SaveAs(filenamePath);

string[] validFileTypes = { "xls", "xlsx"};                
string ext = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);
bool isValidFile = false;                
string fileName = FileUpload1.FileName;
for (int i = 0; i < validFileTypes.Length; i++)
{
    if (ext == "." + validFileTypes[i])
    {
        isValidFile = true;
        break;                    
    }
}
if (isValidFile)
    {
        DataTable dt = ConvertXLSTpXLM.convertXLSToDb(filenamePath, "ELEMENT", "ELEMENTS", true, fileName);

    }

这是convertXLSToDb方法

public static DataTable convertXLSToDb(string filePath, string firstElement, string secondElement, bool hasHeaders, string filename)
{
    DataTable dtexcel = new DataTable();
    string HDR = hasHeaders ? "Yes" : "No";
    string strConn;
    if (filePath.Substring(filePath.LastIndexOf('.')).ToLower() == ".xls")
        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=0\"";
    else
        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=0\"";
        OleDbConnection conn = new OleDbConnection(strConn);
        conn.Open();
        DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
        DataRow schemaRow = schemaTable.Rows[0];
        string sheet = schemaRow["TABLE_NAME"].ToString();
        if (!sheet.EndsWith("_"))
        {
            string query = "SELECT  * FROM [" + sheet + "]";
            OleDbDataAdapter daexcel = new OleDbDataAdapter(query, conn);
            dtexcel.Locale = CultureInfo.CurrentCulture;
            daexcel.Fill(dtexcel);
        }

        conn.Close();
        return dtexcel;
}

没有错误发生,但在“daexcel.Fill(dtexcel);”上页面无限运行。

2 个答案:

答案 0 :(得分:2)

  

如果我用大小为25kb的.xls文件运行下面的代码,它工作正常,但是如果我加载一个更大的文件(7,52MB),它就不起作用。

事实上你没有Dispose很多IDisposable资源到一边,文件大小可能没有问题,而问题是文件的内容文件。也就是说,你可能会有一个“好奇”的数据行,如果你把这些好奇的数据放到25kb的文件中,它也行不通。

Microsoft明确声明using ACE in a service environment is a bad idea

  

Access数据库引擎2010可再发行组件无意:

     

...

     

由系统服务或服务器端程序使用,其中代码将在系统帐户下运行,或者将同时处理多个用户身份,或者是高度可重入的并且期望无状态行为。示例包括在没有用户登录时从任务调度程序运行的程序,或从服务器端Web应用程序(如ASP.NET )调用的程序,或在COM +服务下运行的分布式组件。

类似的警告适用于JET,但它们没有明确记录。

要诊断出问题所在,请从ASP .NET中获取代码并将其放入交互式控制台应用程序中并运行它。

如果代码仍然存在问题,您可以考虑将该过程与调试器暂停,并尝试检查代码已“冻结”的位置。暂停GetOleDbSchemaTable代替Fill可能会有所启发。

除此之外,鉴于在服务器环境中不建议使用JET和ACE,您可以考虑放弃.xsl支持并使用EPPlus之类的内容来阅读.xlsx文件。

答案 1 :(得分:1)

文件上传控件默认情况下只能上传4MB的文件。请参阅下面的注释。

http://msdn.microsoft.com/en-us/library/ms227669(v=vs.90).aspx

您可以在Web配置中更改httpRuntime maxRequestLength,如下所述。

How to programmatically set (using GET SET property) "httpRuntime maxRequestLength" in ASP.NET with C# as code behind

希望这有帮助!

相关问题