У меня есть следующий смехотворно простой код:
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. Не вижу ничего явно неправильного, кроме того, что он устарел, но я бы подумал, что он все равно будет функционировать. Я не пытаюсь написать какой-либо производственный код, я просто пытаюсь сделать одноразовый тест.
Вы не связали свой объект соединения с командой.
cmd.Connection = conn;
или передать его в конструкторе Command:
using (OracleCommand cmd = new OracleCommand("SELECT * from CONTRACT", conn))
Вы не назначили экземпляр 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
((IDisposible)reader).Dispose();
использование будет обрабатывать автоматическую утилизацию для вас C # MSDN с помощью Statement, проверьте это в это время Пит
using