【问题标题】:Error while trying to download large file from database using Entity Framework尝试使用实体框架从数据库下载大文件时出错
【发布时间】:2014-02-03 14:45:40
【问题描述】:

我正在尝试使用以下代码从数据库下载文件:

using(SFTDBEntities db = new SFTDBEntities()) {
    Guid Id_LogServerLogFile = Guid.Parse(lblId.Text.Trim());
    LogServerLogFile logServerLogFile = new LogServerLogFile();
    logServerLogFile = db.LogServerLogFiles.FirstOrDefault(x = > x.Id == Id_LogServerLogFile);
    byte[] data = logServerLogFile.LogServerLogFilesData.TFFileData;
    long sz = logServerLogFile.TFFileSize;
    Response.ClearContent();
    Response.ContentType = logServerLogFile.TFFileMimeType;
    Response.AddHeader("Content-Disposition", string.Format("attachment; filename = " + logServerLogFile.TFFileName));
    Response.AddHeader("Content-Length", sz.ToString("F0"));
    Response.Expires = 30;
    Response.Buffer = true;
    Response.BinaryWrite(data);
    Response.Flush();
    Response.End();
}

对于小尺寸文件它可以正常工作,但是当我尝试下载大文件时(例如:27 MB) 在以下行:

byte[] data = logServerLogFile.LogServerLogFilesData.TFFileData;

我收到以下错误:

Invalid attempt to call IsDBNull when reader is closed.

任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net entity-framework download


    【解决方案1】:

    你需要增加命令超时时间:

    using (SFTDBEntities db = new SFTDBEntities())
    {
        db.CommandTimeout = int.MaxValue; //For test
    
        Guid Id_LogServerLogFile = Guid.Parse(lblId.Text.Trim());
        LogServerLogFile logServerLogFile = new LogServerLogFile();
        logServerLogFile = db.LogServerLogFiles.FirstOrDefault(x => x.Id == Id_LogServerLogFile);
        byte[] data = logServerLogFile.LogServerLogFilesData.TFFileData;
        long sz = logServerLogFile.TFFileSize;
        Response.ClearContent();
        Response.ContentType = logServerLogFile.TFFileMimeType;
        Response.AddHeader("Content-Disposition", string.Format("attachment; filename = " + logServerLogFile.TFFileName));
        Response.AddHeader("Content-Length", sz.ToString("F0"));
        Response.Expires = 30;
        Response.Buffer = true;
        Response.BinaryWrite(data);
        Response.Flush();
        Response.End();
    }
    

    编辑: 如果你使用的是 EF5,你可以在配置中设置connection timeout

    <connectionStrings>
    
        <add name="AdventureWorksEntities"       connectionString="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl;
    provider=System.Data.SqlClient;provider connection string='Data Source=localhost;
    Initial Catalog=AdventureWorks;Integrated Security=True;Connection Timeout=180;
    multipleactiveresultsets=true'" providerName="System.Data.EntityClient" />
    
    </connectionStrings>
    

    或者在上下文中:

    public class SFTDBEntities : DbContext
    {
        public SFTDBEntities ()
            : base(ContextHelper.CreateConnection("Connection string"), true)
        {
            ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
        }
    }
    

    来源:Set database timeout in Entity Framework

    【讨论】:

    • 我正在使用 EF5,当我尝试您的代码时,'CommandTimeout' 属性不存在!
    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 2015-05-24
    • 2017-02-04
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    相关资源
    最近更新 更多