如果datareader中不存在row

时间:2012-02-14 11:02:33

标签: c# idatareader

名为eventreader的数据阅读器可以为空,我正在尝试找出一个合适的语句来检测datareader是否包含行以及是否存在require记录。

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 个答案:

答案 0 :(得分: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();
            }
    }
}

答案 1 :(得分:1)

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

从该帮助页面:

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

  

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

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