OracleClient говорит, что мое соединение закрыто

1

У меня есть следующий смехотворно простой код:

    static void Main(string[] args)
    {
        using (OracleConnection conn = new OracleConnection("Data Source=tnsname;User Id=zzzz;Password=xxxx"))
        {
            using (OracleCommand cmd = new OracleCommand("SELECT * from CONTRACT"))
            {
                conn.Open();
                IDataReader reader = cmd.ExecuteReader();
            }
        }
    }
}

Очевидно, что я изменил строку подключения, но если строка подключения неверна, conn.Open() завершается с ошибкой, поэтому я знаю, что строка подключения верна, по крайней мере, до источника данных, идентификатора пользователя и пароля.

Однако, когда он получает cmd.ExecuteReader(), я получаю InvalidOperationException с сообщением " Invalid operation. The connection is closed. Invalid operation. The connection is closed.

Я сделал много вещей SQL Server из С#, но это первый раз, когда я использовал OracleClient. Не вижу ничего явно неправильного, кроме того, что он устарел, но я бы подумал, что он все равно будет функционировать. Я не пытаюсь написать какой-либо производственный код, я просто пытаюсь сделать одноразовый тест.

Теги:
system.data.oracleclient

2 ответа

3
Лучший ответ

Вы не связали свой объект соединения с командой.

cmd.Connection = conn;

или передать его в конструкторе Command:

using (OracleCommand cmd = new OracleCommand("SELECT * from CONTRACT", conn))
  • 0
    Я идиот. Спасибо вам обоим.
  • 1
    @ Пит нет, нет, нет, это просто недосмотр вашего человека, и мы все совершаем ошибки ... по крайней мере, вы проявили заслуживающие доверия усилия, на мой взгляд ... не стоит упускать из виду то, что вы не видели этого сразу
1

Вы не назначили экземпляр Connection экземпляру OracleCommand

static void Main(string[] args)
{
    using (OracleConnection conn = new OracleConnection("Data Source=tnsname;User Id=zzzz;Password=xxxx"))
    {
        using (OracleCommand cmd = new OracleCommand("SELECT * from CONTRACT", conn))
        {
            conn.Open();
            using(IDataReader reader = cmd.ExecuteReader())
            {
                .....
            }
        }
    }
}

Просто добавьте экземпляр conn к конструктору команды.
Кстати, и читатель должен быть заключен в оператор using

  • 0
    @Pete причина, по которой Стив предложил обернуть объект Reader вокруг оператора using, чтобы вам не приходилось явно вызывать что-то вроде следующего, чтобы избавиться от объекта ((IDisposible)reader).Dispose(); использование будет обрабатывать автоматическую утилизацию для вас C # MSDN с помощью Statement, проверьте это в это время Пит
  • 0
    @MethodMan Как вы можете видеть в моем оригинальном сообщении, я уже using
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню