2013-03-20 3 views
1

Я пытаюсь использовать инструкцию Using() с кодом SqlConnection.Состояние связи закрыто при использовании объекта

Я сделал SqlConnection страница свойство, как так ...

public SqlConnection baseConnection 
{ 
    get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); } 
} 

затем создал using() оператор вроде так ...

using (baseConnection) 
      { 
       SqlCommand select = new SqlCommand("SELECT * FROM TABLE", baseConnection); 
       baseConnection.Open(); 
       SqlDataReader reader = select.ExecuteReader(); 

       //... other irrelevant code 
      } 

Но при выполнении кода я получаю исключение

Сведения об исключении: System.InvalidOperationException: ExecuteReader требует открытого и ava ilable Connection. текущее состояние соединения с использованием закрыт

Я понимаю исключение, что я не понимаю, почему это соединение не открыто, когда я открыл ее baseConnection.Open()?

Я использую это соединение по всему сайту, и я хотел бы поместить его в пользовательский базовый класс как свойство страницы, поэтому мне не нужно набирать его. Разве это не разрешено?

ответ

6

Проблема я нахожу в вашем примере

Вы получаете новый объект SqlConnection каждый раз, когда вы запрашиваете baseConnection недвижимость

Проблемный код:

public SqlConnection baseConnection 
{ 
    get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); } 
} 

исправленный код

private SqlConnection _baseConnection; 
public SqlConnection BaseConnection 
{ 
    get { return _baseConnection = _baseConnection ?? new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); } 
} 

Здесь return _baseConnection = _baseConnection ?? new SqlConnection() использует оператор Null Coaleasing из C# ?? т.е. Это создаст новый экземпляр, если _baseConnection переменная равна нулю.

Мои Предположения
BaseConnection свойство определяется в некоторой BaseClass и производный класс не распространяется далее в подразделе производный класс. И таким образом вы бы использовали один SqlConnection для каждого типа производных классов.

+1

@Aniket: потому что baseConnection присоединен к SelectCommand не один, который получает открыл – jbl

+0

Я не думаю, что это хорошая идея. вызов 'Dispose' в соединении не делает его« null ». поэтому это будет работать только один раз (тогда он будет создан) и не будет работать в остальное время. –

+0

@jbl hmm, ........ –

1

Ваш код должен быть:

using (var myConnection = baseConnection) 
      { 
       SqlCommand select = new SqlCommand("SELECT * FROM TABLE", myConnection); 
       myConnection .Open(); 
       SqlDataReader reader = select.ExecuteReader(); 

       //... other irrelevant code 
      } 
0
string sQry = "Select * from TestEmp"; // Select Table 
    SqlCommand cmd = new SqlCommand(sQry, conDB);// Pass Sql Query & Sql Connection in Sql Command 
    conDB.Open();// Open DB 
    SqlDataAdapter objAdapter = new SqlDataAdapter(cmd); // Create DisConnected Architecture 
    DataTable objTable = new DataTable(); // Create Data Table 
    objAdapter.Fill(objTable);// Fill Data Table using Adapter Object 
    dgvDisplay.DataSource = objTable; // Display select result in DataGridView Box 
    conDB.Close(); // Close Connection