2016-03-29 4 views
-1

Я сохраняю файлы базы данных в SQL Server Management Studio. У меня есть элемент управления gridview, который отображает файлы PDF, которые хранятся в моей базе данных. У меня также есть linkbutton «View», который предположительно будет просматривать соответствующий файл. Проблема, с которой я сталкиваюсь, заключается в том, что содержимое не отображается в моем личном контроле. EDIT: У меня все еще возникают проблемы с отображением содержимого в моем личном контроле. Я получаю сообщение об ошибке: Неверная попытка прочитать, когда данные отсутствуют. Ошибка, которую я получаю, находится в этой строке: bytes = (byte []) sdr ["Attachment"]; Я не совсем уверен, что еще попробовать, но вот мой код, который у меня есть до сих пор:Почему мой контент PDF не отображается в моем контроле Literal?

Это мой обработчик, который вызывается, который использует ID из QueryString. Предположим, что вы выбрали данные File. Вот код для моего обработчика:

public class FileCS : IHttpHandler 
{ 
public void ProcessRequest(HttpContext context) 
{ 
    int id = int.Parse(context.Request.QueryString["id"]); 
    byte[] bytes; 
    string fileName, contentType; 
    string constr = ConfigurationManager.ConnectionStrings["PALM3ConnectionString2"].ConnectionString; 
    using (SqlConnection con = new SqlConnection(constr)) 
    { 
     using (SqlCommand cmd = new SqlCommand()) 
     { 
      cmd.CommandText = "SELECT Attachment FROM Support_Doc WHERE [email protected]"; 
      cmd.Parameters.AddWithValue("@SupportDocID", id); 
      cmd.Connection = con; 
      con.Open(); 
      using (SqlDataReader sdr = cmd.ExecuteReader()) 
      { 
       sdr.Read(); 
       bytes = (byte[])sdr["Attachment"]; 
       contentType = sdr["Name"].ToString(); 
       fileName = sdr["Type"].ToString(); 

      } 
      con.Close(); 
     } 
    } 
    context.Response.Buffer = true; 
    context.Response.Charset = ""; 
    if (context.Request.QueryString["download"] == "1") 
    { 
     context.Response.AppendHeader("Content-disposition", "attachment; filename=" + fileName); 
    } 
    context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    context.Response.ContentType = "application/pdf"; 
    context.Response.BinaryWrite(bytes); 
    context.Response.Flush(); 
    context.Response.End(); 
} 
public bool IsReusable 
{ 
    get 
    { 
     return false; 
    } 
} 
} 

Это мой код для обработки моего LinkButton при щелчке внутри моего GridView:

protected void Button2_Click(object sender, EventArgs e) 
    { 

     //int id = int.Parse((sender as LinkButton).CommandArgument); 
     int id = Convert.ToInt32(Request.QueryString["SupportDocID"]); 
     string embed = "<object data=\"{0}{1}\" type=\"application/pdf\" width=\"500%\" height=\"600px\">"; 
     embed += "If you are unable to view file, you can download from <a href = \"{0}{1}&download=1\">here</a>"; 
     embed += " or download <a target = \"_blank\" href = \"http://get.adobe.com/reader/\">Adobe PDF Reader</a> to view the file."; 
     embed += "</object>"; 

     ltEmbed.Text = string.Format(embed, ResolveUrl("~/FileCS.ashx?Id="), id); 

    } 

Этот код загружает файл в моей базе данных:

protected void Button1_Click(object sender, EventArgs e) 
    { 
     string filename = Path.GetFileName(FileUpload1.PostedFile.FileName); 
     string contentType = FileUpload1.PostedFile.ContentType; 
     using (Stream fs = FileUpload1.PostedFile.InputStream) 
     { 
      using (BinaryReader br = new BinaryReader(fs)) 
      { 
       byte[] bytes = br.ReadBytes((Int32)fs.Length); 
       using (SqlConnection con = Connection.GetConnection()) 
       { 
        //using (SqlCommand com = new SqlCommand()) 
        //{ 

         // com.CommandText = "UploadDoc"; 
         //com.CommandType = CommandType.StoredProcedure; 
        string query = "insert into Support_Doc values (@Type, @Name, @Attachment)"; 
        using (SqlCommand com = new SqlCommand(query)){ 
         com.Connection = con; 
         com.Parameters.AddWithValue("@Type", filename); 
         com.Parameters.AddWithValue("@Name", contentType); 
         com.Parameters.AddWithValue("@Attachment", bytes); 
         con.Open(); 
         com.ExecuteNonQuery(); 
         Label1.ForeColor = System.Drawing.Color.Green; 
         Label1.Text = "File Uploaded Successfully!"; 
         con.Close(); 
        } 

       } 
      } 
     } 
     Response.Redirect(Request.Url.AbsoluteUri); 
    } 

Я искал всюду на этом без всякой удачи. Любая помощь, я был бы так благодарен !!! Еще раз спасибо!!!!!

+0

Какой литеральный контроль? Какая строка выдает ошибку? – David

+0

Выдает ошибку в этой строке: int id = int.Parse (context.Request.QueryString ["id"]); – user3474069

+0

И что такое 'context.Request.QueryString [" id "]' когда это происходит? Похоже, что ошибка означает, что она «null». – David

ответ

0

Эта линия (и другие подобные ему):

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

предполагает, что данные присутствуют в устройстве считывания данных. Однако, если эта строка возвращает false:

sdr.Read(); 

то запись не была найдена. Таким образом, ошибка говорит вам, что вы пытаетесь прочитать запись, которой нет. Это аналогично попытке прочитать первый элемент пустого массива (emptyArray[0]).

Вы можете использовать возвращаемое значение bool от sdr.Read(), чтобы определить, существует ли запись, прежде чем пытаться прочитать эту запись. Если вы ждете именно одну запись (что подразумевает код), то что-то, как это должно работать:

if (sdr.Read()) 
{ 
    bytes = (byte[])sdr["Attachment"]; 
    contentType = sdr["Name"].ToString(); 
    fileName = sdr["Type"].ToString(); 
} 
else 
{ 
    // no record was found, how do you want to proceed? 
} 

Что делать в else блоке до вас. Может быть, вернуть пользователю сообщение об ошибке? Возможно, выполнить другой запрос, чтобы вернуть пользователю «PDF-файл по умолчанию»? Что-то другое? Однако вы хотите обработать условие ошибки, зависит от того, как вы хотите, чтобы система вела себя. Дело в том, что существует потенциальная ошибка, и вам нужно ее проверить.

В конечном счете, запрашивается запись, которая не существует. Поэтому код должен уметь это учитывать.

+0

Я нашел проблему, проблема была в моем событии Button2_Click. Я должен был использовать: int id = int.Parse ((отправитель как LinkButton) .CommandArgument); вместо: int id = Convert.ToInt32 (Request.QueryString ["SupportDocID]]); Я использовал его первоначально, но мой идентификатор querystring, который я использовал в моем обработчике, был установлен в SupportDocID вместо id. Я добавил инструкцию if else для моего читателя. Спасибо, Дэвид! – user3474069

Смежные вопросы