Причина ошибки около Invalid attempt to read when no data is present
заключается в том, что DataReader не содержит никаких записей (нет изображения для данного идентификатора).
Попробуйте изменить код на:
SqlDataReader dReader = cmd.ExecuteReader();
if (dReader.HasRows)
{
while (dReader.Read())
{
context.Response.BinaryWrite((byte[])dReader["a_data"]);
}
dReader.Close();
}
Несколько предложений по улучшению
- попытаться предсказать, когда в строке не будет изображения
- когда вы можете обнаружить на своей странице ASP.NET, выполните вызов на страницу .ashx
- когда вы можете обнаружить, что вам нужно отобразить ссылку на PDF, покажите хорошее статичное изображение в формате PDF, и его ссылкой будет URL.
Подумайте, по возможности, проверьте, чтобы в данной Оценке было необходимое изображение или PDF. Возможно, добавьте предложение where, чтобы как-то определить, должна ли эта запись отображать сценарий PDF или изображение.
Могу ли я также предложить вам преобразовать ваши операторы SQL в хранимую процедуру, как указано выше, и изменить ваш SqlDataSource следующим образом:
CREATE PROC ListAssessments
AS
SELECT [assessment_id]
, [a_data]
, [a_mime]
, CASE WHEN a_mime = 'PDF' THEN 1
ELSE 0
END AS IsPDF
FROM Assessments
Теперь в вашем Gridview вы можете определить, хотите ли вы отобразить изображение или ссылку PDF.
<asp:TemplateField HeaderText="Image">
<ItemTemplate>
<asp:PlaceHolder id="ph1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
Настройте Gridview на событие ItemDataBound, которое вызывает новый метод, который вы можете написать.
<asp:GridView OnRowDataBound="ShowImageOrPdf"
В своем коде вы можете определить, какой веб-элемент управления будет отображаться в этом заполнителе.
protected void ShowImageOrPdf(object sender, GridViewRowEventArgs e)
{
const string LINK = "handler.ashx?Id={0}&Type={1}";
GridView gv = (GridView)sender;
if (e.Row.RowType == DataControlRowType.DataRow)
{
string assessmentID = gv.DataKeys[e.Row.RowIndex].Value.ToString();
bool isPDF = (bool)e.Row.DataItem["IsPDF"];
HyperLink h = new HyperLink();
if (isPDF)
{
//render a link showing that it's a PDF.
h.NavigateUrl = string.Format(LINK, assessmentID, "PDF");
h.ImageUrl = "http://www.adobe.com/images/pdficon_large.gif";
h.Text = "View PDF";
}
else
{
//render a thumbnail with a link to the image
h.NavigateUrl = string.Format(LINK, assessmentID, "IMG");
//have the handler create a thumbnail somehow.
h.ImageUrl = string.Concat(h.NavigateUrl + "&Size=Small");
}
//write the link back to the placeholder.
e.Row.FindControl("ph1").Controls.Add(h);
}
}
Затем в вашем .ashx
вам нужно будет прочитать параметры строки запроса, чтобы определить, что выводить: изображение, эскиз или документ PDF, сохраненный в базе данных.