0

名为 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
                 }
            }
4

2 回答 2

1

您可以使用例如检查 DataReader 是否有任何行

if (eventReader.HasRows)

更新: 来自下面的评论: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();
            }
    }
}
于 2012-02-14T11:05:40.980 回答
1

您可能误解了IDataReader.Read()的工作原理。

从该帮助页面:

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

IDataReader 的默认位置在第一条记录之前。因此,您必须调用 Read 才能开始访问任何数据。

因此,当您第一次获得数据读取器时,它不会指向任何数据。如果你调用.Read()它,如果有一行要移动并移动到它,它将返回 true,如果没有行,它将返回 false。

于 2012-02-14T11:18:01.623 回答