Проблема с SqlDataReader! - PullRequest
0 голосов
/ 16 мая 2011

Это ответ на вопрос , который я задавал ранее, поскольку я не могу опубликовать его там раньше, чем через 8 часов, я создал новый вопрос с проблемой, с которой я сталкиваюсь,

Вот код:

if (context.Request.QueryString["id"] != null)
{
       int id = int.Parse(context.Request.QueryString["id"].ToString());
       string connectionString = "Data Source=tarun-PC\\SQLEXPRESS;Initial Catalog=mydb;Integrated Security=True";
       string commandString = "Select fsImage from WHATSNSTORE_FEATURED_STORES where imageId=" + id;

       SqlConnection oConnection = new SqlConnection(connectionString);
       SqlCommand oCommand = new SqlCommand(commandString, oConnection);

       if (oConnection.State != ConnectionState.Open)
       {
            oConnection.Open();
       }

       SqlDataReader myDataReader = oCommand.ExecuteReader();

      //myDataReader.Read();

       try
       {
            if (myDataReader.Read())
            {
                 context.Response.ContentType = "image/jpg";
                 context.Response.BinaryWrite((byte[])myDataReader["fsImage"]);
            }
       }
       catch (Exception ex)
       {

         context.Response.Write(ex.Message);
       }

Моя таблица

create table WHATSNSTORE_FEATURED_STORES
(
    imageId int primary key identity,
    fsImage image
)

Единственная проблема теперь заключается в том, что при отладке она пропускает часть if(myDataReader.Read()), которая указывает, что нетданные присутствуют!

Как мне решить проблему?

Ответы [ 3 ]

1 голос
/ 16 мая 2011

Если ваш читатель пуст, это значит, что ваш запрос не дал результата.

Глядя на ваш код, я бы сказал, что изображение отсутствует в базе данных. Вы, вероятно, должны предполагать, что это может и произойдет, и либо передавать пустое изображение в браузер, либо возвращать ошибку HTTP 404.

[Update]

Вы проверяли сгенерированную строку SQL? Когда вы добавляете id в строку SQL, она возвращается в строку. Если идентификатор больше 1000, вы можете получить локализованное представление целого числа (т.е. 1.000 вместо 1000). Это объясняет, почему ваш запрос в SSMS возвращает результат, а страница - нет.

Оригинальный ответ: Я заметил, что вы используете int.Parse; вы можете вместо этого использовать int.TryParse. Это просто вернет false, если значение не является действительным int. Кроме того, вы строите свой SQL путем конкатенации строк. Это считается плохой практикой. Вы должны использовать параметры. Еще одна лучшая практика - заключить соединение и читателя в оператор using. Это обеспечит закрытие соединения и считывателя, когда они больше не нужны, особенно в случае исключения. Наконец, вы можете рассмотреть возможность перемещения строки подключения в файл web.config.

0 голосов
/ 16 мая 2011

Вы уверены, что правильно настроили отладчик? Вы подключаетесь к процессу, и поэтому развернутые файлы .dbg не соответствуют файлам .dll в каталоге отлаженного бина? Вы пытались присвоить myDataReader.Read () bool, чтобы увидеть, есть ли какая-либо информация в базе данных?

0 голосов
/ 16 мая 2011

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

...