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 需要打开且可用的连接。连接的当前状态为关闭

我理解异常,我不明白的是,为什么我打开连接时连接没有打开baseConnection.Open()

我在整个站点中都使用此连接,并且我想将它作为页面属性放入自定义基类中,这样我就不必继续输入它了。这是不允许的吗?

4

3 回答 3

6

我在你的例子中发现的问题

每次请求baseConnection属性时都会获得新的 SqlConnection 对象

有问题的代码:

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()是使用 C# 中的 Null Coaleasing 运算符,即如果变量为空??,它将创建新实例。_baseConnection

我的 Assumptions
BaseConnection属性在某些中定义BaseClass,派生类未在子派生类中进一步扩展。通过这种方式,每个派生类类型都会使用一个 SqlConnection。

于 2013-03-20T10:07:31.673 回答
1

您的代码应该是:

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

                //... other irrelevant code
            }
于 2013-03-20T10:12:24.877 回答
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
于 2015-06-30T06:31:44.010 回答