SqlReader中未读取任何数据无数据时读取的尝试无效。

时间:2013-03-28 14:15:22

标签: asp.net sql handler sqldatareader

我知道此问题之前已经发布了数百万次,但这可能会有所不同。

我正在使用带有id,year,month,pdffile

列的sql表

在我的网页中,我希望用户能够查看他们希望从他们选择的时间范围内查看的pdf文档。

到目前为止:

string year = ddlYear.SelectedValue.ToString();    
string month = ddlMonth.SelectedValue.ToString();
pdfFrame.Attributes["src"] = "../pdfDocs.ashx?Year=" + year + "&Month=" + month;

如果存在,则加载pdf。这是我的问题。 我怎么能在我的问题标题中发现错误?我想捕获该错误,并在标签中向用户显示没有找到文件的消息。我正在使用一个处理程序来读取作为我的pdf文件的varbinary。

这是处理程序代码:

SqlConnection conn = new SqlConnection(@"Server=DEV6\MSSQLHOSTING;Database=Intranet;Trusted_Connection=True;");
conn.Open();
SqlCommand cmd = new SqlCommand("select PDFDocument from LeaveChart where (Year like @Year and Month like @Month)", conn);
cmd.Parameters.AddWithValue("Year", context.Request.QueryString["Year"]);
cmd.Parameters.AddWithValue("Month", context.Request.QueryString["Month"]);
SqlDataReader reader = cmd.ExecuteReader();

reader.Read();

byte[] content = (byte[])reader.GetValue(0);
MemoryStream ms = new MemoryStream(content);
ms.Position = 0;
context.Response.ContentType = "Application/pdf";
ms.WriteTo(context.Response.OutputStream);
context.Response.End();
reader.Close();
conn.Close();
像我说的那样,它可以显示当前文件。谁能提供一些建议? 是否有可能将处理程序中的消息发送回网页,说明没有文件以及如何显示它而不会让客户感到震惊?

提前致谢

1 个答案:

答案 0 :(得分:0)

如果您可以更改处理程序的签名,则:

public bool <YourHandlerName>(out MemoryStream ms)
{
SqlConnection conn = new SqlConnection(@"Server=DEV6\MSSQLHOSTING;Database=Intranet;Trusted_Connection=True;");
conn.Open();
SqlCommand cmd = new SqlCommand("select PDFDocument from LeaveChart where (Year like  @Year and Month like @Month)", conn);
cmd.Parameters.AddWithValue("Year", context.Request.QueryString["Year"]);
cmd.Parameters.AddWithValue("Month", context.Request.QueryString["Month"]);
SqlDataReader reader = cmd.ExecuteReader();
reader.Read();
ms = new MemoryStream(content);
if(reader.HasRows)
 {
  byte[] content = (byte[])reader.GetValue(0);
  ms.Position = 0;
  context.Response.ContentType = "Application/pdf";
  ms.WriteTo(context.Response.OutputStream);
  context.Response.End();
  reader.Close();
  conn.Close();
  return true;
 }
 return false;
}

我想我的问题是正确的。