在我目前的应用中,我需要执行SQL查询,并在继续之前获取返回结果的计数。这是我的代码:
if (GetCount(reader) == 1)
{
reader.Read();
Console.WriteLine(reader["field1"]);
Console.WriteLine(reader["field2"]);
}
这是GetCount()
方法
public static int GetCount(OracleDataReader reader)
{
int count = 0;
while (reader.Read())
{
count++;
}
return count;
}
在收到结果计数后,当它进入if代码块时,会抛出异常,说明:
[System.InvalidOperationException] = {"Operation is not valid due to the current state of the object."}
然而,如果我没有得到计数,它运作正常。
我认为既然我的GetCount函数有reader.Read(),我需要在读取值之前以某种方式重置读者吗?老实说,我很难过。有什么建议吗?
编辑;
在第一个代码块中,即使我注释掉reader.Read();
答案 0 :(得分:2)
在GetCount()
之后,您已经通过读者进行了迭代。在拨打下一个reader.Read()
之前,你需要对你的价值做些什么,否则你就会失去它们。基本上你正在尝试iterate through your reader twice,这是你无法做到的。
您可以通过引用将DataSet
传递给GetCount()
并填充它,然后引用主代码块中的DataSet
。但是,如果你把它放入DataSet
,你实际上并不需要自己计算任何东西,因为DataSet
有足够的属性。
示例:
myDataset.Tables[0].Rows.Count
修改强>: 试试这个
OracleDataAdapter adapter = new OracleDataAdapter(yourSQLQuery,yourConnString);
DataSet data = new DataSet();
adapter.Fill(data);
if (data.Tables.Count != 0)
{
if (data.Tables[0].Rows.Count == 1)
{
...
}
}
答案 1 :(得分:1)
由于您使用的是阅读器,因此您已经到了最后,需要将其重置为回到开头。
看起来你并不在乎计数是什么,只是它有行。所以你可以使用HasRows属性。
if (reader.HasRows)
{
reader.Read();
Console.WriteLine(reader["field1"]);
Console.WriteLine(reader["field2"]);
}
如果您真的需要行数,这将无效,但在此示例中,它无关紧要。
http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracledatareader.aspx