名为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
}
}
您可以使用例如检查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();
}
}
}
您可能误解了IDataReader.Read()的工作原理。
从帮助页面:
Return Value
Type: System.Boolean
true if there are more rows; otherwise, false.
和
IDataReader的默认位置在第一条记录之前。因此,必须调用Read才能开始访问任何数据。
因此,当您第一次获得数据读取器时,它不会指向任何数据。如果调用.Read()
,则如果有行要移动并移动到它,则返回true;如果没有行,则返回false。