名为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
}
}
答案 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。