Невозможно использовать SqlCeDataReader.HasRow - PullRequest
0 голосов
/ 19 мая 2011

[EDIT] Я изменил свой код в соответствии с вашими ответами. Но теперь я получаю еще одну ошибку:

IndexOutOfRangeException был обработан.

У меня для начала пустая таблица. Weird ..

Ниже мой код. Есть идеи?

using (SqlCeDataReader rdr = cmd.ExecuteReader())
{
    while (rdr.Read())
    {
        dg2.Items.Add(new DataItem2() { FooName = (string)rdr["FooName"],});
    }
    rdr.Close();
}

[РЕДАКТИРОВАТЬ - 2-е] Я отредактировал свой код и использую rdr [0] вместо rdr ["String"], я получаю другую ошибку

"Индекс находился за пределами массива."

Боже мой, это сводит меня с ума. У меня есть абсолютно пустые строки для начала, и я понятия не имею, как эти странные ошибки всплывают

using (SqlCeDataReader rdr = cmd.ExecuteReader())
{
    while (rdr.Read())
    {
        dg2.Items.Add(new DataItem2() { FooName = (string)rdr[0],});
    }
    rdr.Close();
}

Ответы [ 3 ]

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

Избавьтесь от оператора HasRows if.Вы можете просмотреть читателей, выполнив while (rdr.Read()).Он вернет false (пропустить время), если записи не возвращены.(По крайней мере, с SqlDataReaders)

0 голосов
/ 10 апреля 2013

Кроме того, если вы используете SqlCeDataReader для возврата агрегатного значения, такого как Max (), это, похоже, не позволяет вам проверять наличие нуля. [Это происходит, если нет строк] IsDbNull (0) выдал ошибку, поэтому я решил просто прочитать значение и перехватить исключение System.Data.SqlTypes.SqlNullValueException, которое будет вызвано.

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

Как говорится в сообщении, HasRows не поддерживается.Вы должны хорошо пропустить этот чек.Также в этих ситуациях рекомендуется использовать using.

using(SqlCeDataReader rdr = cmd.ExecuteReader())
{
    while (rdr.Read())
    {
        dg2.Items.Add(new DataItem2() { FooName = (string)rdr["FooName"] });
    }
}
...