2011-01-07 2 views
0

В моем текущем appliction мне нужно выполнить SQL-запрос и получить счет результатов, которые были возвращены перед продолжением. Это мой код ниже:OracleDataReader выбрасывает исключение

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; 
     } 

После получения подсчета результатов, когда он входит в, если блок кода, исключение выбрасывается с указанием:

[System.InvalidOperationException] = {"Operation is not valid due to the current state of the object."} 

Однако, если у меня нет счета, он отлично работает.

Я думаю, что поскольку моя функция GetCount имеет reader.Read(), мне нужно как-то сбросить считыватель перед чтением значений? Честно говоря, я в тупике. Какие-либо предложения?

Редактировать; В первом блоке кода я получаю такое же исключение, даже если я прокомментирую reader.Read();

ответ

2

После GetCount() вы проверили читателя. Вам нужно что-то сделать с вашими значениями, прежде чем вы вызовете следующий reader.Read() или вы просто потеряете их. В основном вы пытаетесь сделать iterate through your reader twice, чего вы не можете сделать.

Вы можете передать DataSet по адресу GetCount() по ссылке и заполнить его, а затем указать DataSet в своем основном кодовом блоке. Однако, если вы положили его в DataSet, вам действительно не нужно ничего считать, так как DataSet обладает достаточными свойствами.

Пример:

myDataset.Tables[0].Rows.Count 

EDIT: Попробуйте

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) 
    { 
     ... 
    } 
} 
+0

Но когда я прохожу читатель GetCount по значению, это не делает копию, так что мой оригинальный читатель остается нетронутым? – xbonez

+1

@xbonez читатель, являющийся ссылочным типом, означает, что вы отправляете копию ссылки по значению, а не копию читателя. Таким образом, вы указываете на одного и того же читателя. –

+0

Это может быть страшное обходное решение, но после прохождения чтения в GetCount, если я скопирую его в другую переменную Datareader и использую это, чтобы получить счет, будет ли это работать? – xbonez

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

+3

Это получило бы количество столбцов, а не строк. –

+0

О, да, это говорит прямо. –

+0

отредактирован по ошибке –