2010-08-08 2 views
1

Использование C#DataReader пуст или пустой

У меня есть datareader, который возвращает lsit записей из базы данных mysql.

Я пытаюсь написать код, который проверяет, является ли datareader isnull. Логика этого заключается в следующем: если у datareader, имеющего поле, тогда отображается информация, в противном случае скрыть поле.

Я пробовал:

cmd1 = new OdbcCommand("Select * from tb_car where vehicleno = '" + textbox2.text + "';", dbcon); 
     dr1 = cmd1.ExecuteReader(); 

if (dr1["tb_car"]. != DBNull.Value) 
{ 
    textbox1.Text = "contains data"; 
} 
else 
{ 
    textbox1.Text = "is null"; 
} 

Приведенный выше код дает мне эту ошибку:

Сведения об исключении: System.IndexOutOfRangeException: Дополнительная

Любая помощь будет принята с благодарностью ...

+1

пс. В вашем коде есть огромная дыра в безопасности, потому что вы не используете параметры. Если я набрал "'; delete * from tb_car;" в текстовое поле вы потеряете все записи! Оу? =) – Will

+0

Человек, я этого не понимал. @Gopal - он прав. Не забудьте также прочитать это: http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/ – David

ответ

9

Я вижу здесь несколько проблем ... Во-первых, похоже, что вы пытаетесь получить доступ к имени таблицы в строке:

if(dr1["tb_car"] != DBNull.Value 

Вы должны передать полевое имя вместо имени таблицы. Таким образом, если таблица с именем «tb_car» было поле, называемое CarId, вы хотите, чтобы ваш код выглядит следующим образом:

if(dr1["CarId"] != DBNull.Value) 

Если я прав, то, вероятно, нет поля с именем «tb_car», и Ошибка индекса вне диапазона - это потому, что DataReader ищет элемент в коллекции столбцов с именем «tb_car» и не находит его. Это в значительной степени то, что означает ошибка.

Во-вторых, прежде чем вы сможете даже проверить его, сначала нужно вызвать команду Read() DataReader, чтобы прочитать строку из базы данных.

так на самом деле ваш код должен выглядеть ...

while(dr.Read()) 
{ 
    if(dr1["CarId"] != DBNull.Value) 
    { 
     .... 

и так далее.

Смотрите здесь для правильного использования DataReader: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx


Наконец, если вы просто проверить, чтобы увидеть, если есть какие-либо строки в таблице, вы можете игнорировать все выше и использования HasRows собственности как в

if(dr.HasRows) 
{ 
    .... 

хотя, если вы используете синтаксис while(dr.Read()), код в то время цикла будет выполняться только тогда, когда есть строки, в первую очередь, так что HasRows потенциально может оказаться ненужной, если вы не не хочу ничего не делайте. Вы все еще хотите использовать его, если вы хотите вернуть сообщение, как «результатов не найдено», конечно ..

Edit - Добавлена ​​

Я думаю, что есть проблема и с линией

if(dr1["CarId"] != DBNull.Value) 

Вы должны использовать, если метод DataReader IsDbNull().как в

if(dr.IsDbNull("CarId")) 

Извините, я пропустил это в первый раз.

3

Используйте dr1.Read(), чтобы проверить, есть ли строка перед попыткой чтения значений. Чтение сначала получает первую строку, а затем возвращает последующие строки, возвращает true, если строка доступна или пустой/конец набора.

например.

// for reading one row 
if (rd1.Read()) 
{ 
    // do something with first row 
} 

// for reading thru multiple rows 
while (rd1.Read()) 
{ 
    // do something with current row 
} 
+0

+1. Это хороший ответ, но я считаю, что он затрагивает только часть проблемы. – David