2014-09-26 61 views
0

我有一個問題,我的代碼..如果我下載文件時,該文件是空的,我得到一個錯誤下載文件錯誤異常C#

無法轉換類型爲「System.DBNull」對象類型 'System.Byte []'

我的代碼C#是:

protected void DownloadFile(object sender, EventArgs e) 
{ 
    int id = int.Parse((sender as LinkButton).CommandArgument); 
    byte[] bytes; 

    string fileName, contentType; 

    // string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; 
    using (SqlConnection con = new SqlConnection("Data Source=OUSSAMA-PC;Initial Catalog=evamedica;Integrated Security=True")) 
    { 
     using (SqlCommand cmd = new SqlCommand()) 
     { 
      cmd.CommandText = "select id,soins,date_sejour,civilite,nom,prenom,date_naissance,email,gsm,adresse,code_postal,ville,pays,accompagnant,nbr_accompagnant,commentaire,connu_evamedica,Name,ContentType,Data from devis where [email protected]"; 

      cmd.Parameters.AddWithValue("@id", id); 

      cmd.Connection = con; 
      con.Open(); 

      using (SqlDataReader sdr = cmd.ExecuteReader()) 
      { 
       sdr.Read(); 
       bytes = (byte[])sdr["Data"]; 
       contentType = sdr["ContentType"].ToString(); 
       fileName = sdr["Name"].ToString(); 
      } 

      con.Close(); 
     } 
    } 

    Response.Clear(); 
    Response.Buffer = true; 
    Response.Charset = ""; 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.ContentType = contentType; 
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName); 
    Response.BinaryWrite(bytes); 
    Response.Flush(); 
    Response.End(); 
} 
+0

代碼片段用於JS/CSS/HTML。它不適用於C#。 – 2014-09-26 10:49:35

+0

對不起兄弟,我是一個新成員 – 2014-09-26 20:56:40

回答

0

異常已經說明了問題是什麼。 由於數據庫中的數據列是NULL(DbNull),因此無法將其轉換爲字節[]。

在嘗試轉換它之前,您必須檢查sdr [「Data」]!= DBNull。 這樣你可以避免這個例外。

if(sdr["Data"] != DBNull.Value) 
    bytes = (byte[])sdr["Data"]; 

如果您不希望您可以使用try-catch塊捕獲異常,並在Data爲NULL時執行必須完成的操作。

乾杯 邁克爾

+2

如果'sdr [「Data」]'實際上是'DBNull.Value',你也想停止任何進一步的代碼執行 - 沒有什麼可以返回響應流... – 2014-09-26 10:51:45

+0

使用'try-catch'作爲正常的控制流處理場景不是一個好方法,並且會導致性能下降。我不會推薦。 – 2014-09-26 10:56:20

0

變化

bytes = (byte[])sdr["Data"]; 

喜歡的東西:

const String DATA = "Data"; 
if (sdr.IsDBNull(sdr.GetOrdinal(DATA))) 
{ 
    bytes = (byte[])sdr[DATA]; 
} 
else 
{ 
    //handle null 
} 
0

的例外是「未分配的局部變量「bytes'` Response.BinaryWrite(字節); 但我發現了一個結果..問題是下載按鈕下載頁面,而不是..我不知道是否有可能禁用linkbu tton如果值爲空

    try 
        { 

bytes =(byte [])sdr [「Data」];

    } 
        catch (Exception ex) 
        { 

         ex.Equals(bytes = System.Text.Encoding.UTF8.GetBytes(String.Empty)); 

        }