Если строка не существует в datareader - PullRequest
0 голосов
/ 14 февраля 2012

Считыватель данных с именем eventreader может быть пустым, и я пытаюсь выработать соответствующий оператор, чтобы определить, содержит ли устройство чтения данных строки и существует ли требуемая запись.

oledbexecute("SELECT [Unit No] FROM UnitOpenAtEvent WHERE [Event ID]='" + strDate + "'");
            eventReader = dbcommand.ExecuteReader();
            for (int i = 0; i < checkboxEvent.Items.Count; i++)
            {
                if (checkboxEvent.GetItemCheckState(i) == CheckState.Checked)
                {
                    if (eventReader["Unit No"] != DBNull.Value)
                    {
                        while (eventReader.Read())
                        {
                            if (eventReader["Unit No"].ToString() == checkboxEvent.Items[i].ToString())
                            {
                                oledbexecute("INSERT INTO UnitOpenAtEvent ([Event ID],[Unit No]) VALUES ('" + strDate + checkboxEvent.Items[i].ToString() + "'");
                                intReader = dbcommand.ExecuteNonQuery();
                            }
                        }
                    }
                    else
                    {
                        oledbexecute("INSERT INTO UnitOpenAtEvent ([Event ID],[Unit No]) VALUES ('" + strDate + checkboxEvent.Items[i].ToString() + "'");
                        intReader = dbcommand.ExecuteNonQuery();
                    }
                }
                else if (checkboxEvent.GetItemCheckState(i) == CheckState.Unchecked)
                {

                   // this is effectively a copy of above
                 }
            }

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Возможно, вы неправильно понимаете, как работает IDataReader.Read () .

С этой страницы справки:

Return Value
Type: System.Boolean
true if there are more rows; otherwise, false.

и

Положение IDataReader по умолчанию предшествует первой записи. Поэтому вы должны вызвать Read, чтобы начать доступ к любым данным.

Так что, когда вы впервые получите устройство чтения данных, оно не будет указывать на какие-либо данные. Если вы вызовете .Read(), он вернет true, если есть строка для перемещения и перехода к ней, и если строк нет, он вернет false.

1 голос
/ 14 февраля 2012

Вы можете проверить, есть ли в DataReader какие-либо строки, например,

if (eventReader.HasRows)

Обновление: Исходя из комментария ниже re: IDataReader ...

Вы можете сделатьчто-то вроде этого (сокращено, чтобы включить наиболее важные биты для краткости)

eventReader = dbcommand.ExecuteReader();
bool hasRow = eventReader.Read();
if (hasRow)
{
    for (int i = 0; i < checkboxEvent.Items.Count; i++)
    {
        ...
            ...
            while (hasRow)
            {
                // Code in here to deal with each row
                hasRow = eventReader.Read();
            }
    }
}
...