2014-01-15 27 views
3

我嘗試使用下面的代碼從數據庫中下載文件,下載從大型數據庫文件:錯誤而嘗試使用實體框架

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. 

任何幫助將不勝感激。

回答

4

你需要增加命令超時:

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

+0

我使用EF5,當我嘗試你的代碼'CommandTimeout'屬性不存在! – Karamafrooz

+0

請參閱我的編輯。 – afzalulh

+0

thx很多,它的工作。順便說一句,我用文件下載的好方法? – Karamafrooz