2013-03-28 2 views
0

Я знаю, что эта проблема была опубликована миллионы раз раньше, но это может быть иначе.Данные не считываются в SqlReader Неверная попытка чтения, когда данных нет.

Я использую таблицу SQL со столбцами ID, год, месяц, pdffile

в моей веб-странице, я хотел бы пользователю просматривать документ в формате PDF, что они хотели бы видеть из того, что временные рамки они выбирают.

до сих пор с этим:

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

он загружает PDF, если она есть. это моя проблема. как я поймаю ошибку в заголовке вопроса? Я хочу поймать эту ошибку и отобразить сообщение на этикетке пользователю, указав, что файл не найден. Я использую обработчик для чтения varbinary, который является моим pdf-файлом.

Вот код обработчика:

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(); 

, как я сказал, что работает, чтобы отобразить существующие файлы. может ли кто-нибудь предложить какие-то предложения? Можно ли отправить сообщение от обработчика обратно на веб-страницу, не говоря ни файла, и как отобразить его, не шокируя клиента?

заранее спасибо

+0

И я предполагаю, что возвращаемый тип вашего обработчика - MemoryStream? –

+0

if (! Reader.Read()) ShowNoFile(); ? – gsharp

+0

есть. возвращаемый тип - это поток памяти @PM –

ответ

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; 
} 

Я предполагаю, что я получил ваш вопрос правильно.

+0

, если я взял это дословное, я бы получил ошибки относительно потока памяти. сказав мне, что это даст другое значение ms, которое используется в родительской или текущей области. –

+0

Другим способом может быть изменение подписи и возврат потока памяти. Например: ** public bool (из MemoryStream ms) ** на ** общедоступный MemoryStream (из файла bool fileFound) **, а затем соответствующим образом установите fileFound. MemoryStream будет пустым, если файл не найден. –