OracleDataReader выдает исключение - PullRequest
0 голосов
/ 07 января 2011

В моем текущем приложении мне нужно выполнить 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();

Ответы [ 2 ]

2 голосов
/ 07 января 2011

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

Вы можете передать 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)
    {
        ...
    }
}
1 голос
/ 07 января 2011

Поскольку вы используете ридер, вы достигли конца, и его нужно будет сбросить, чтобы вернуться к началу.

Похоже, вас не волнует, что это за счет, просто у него есть строки.Так что вы можете просто использовать свойство 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...