2013-03-20 72 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需要open和ava可用连接。连接的当前状态已关闭

我了解异常,我不明白的是为什么当我用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()使用空Coaleasing运营商从C#??即如果_baseConnection变量为null,这将创造新的实例。

我的假设
BaseConnection属性在一些BaseClass定义和派生类不是在子派生类进一步扩展。通过这种方式,您可以为每个派生类类型使用一个SqlConnection。

+1

@Aniket:由于附着到的SelectCommand的baseConnection是不是该被打开 – jbl 2013-03-20 10:10:05

+0

我不认为这是一个好主意的人。在连接上调用Dispose并不会使其成为null。因此,这只会工作一次(然后创建),并在其余时间失败。 – 2013-03-20 10:11:20

+0

@jbl嗯,........ – 2013-03-20 10:11:23

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