使用属性时关闭连接状态

时间:2013-03-20 10:04:31

标签: c# asp.net properties sqlconnection

我正在尝试使用带有Using()的{​​{1}}语句。

我已将SqlConnection页面属性设为如此...

SqlConnection
然后

创建了public SqlConnection baseConnection { get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); } } 语句,就像这样......

using()

但是当代码运行时我得到一个异常

  

异常详细信息:System.InvalidOperationException:ExecuteReader需要一个开放且可用的连接。连接的当前状态已关闭

我理解异常,我不明白,为什么当我用using (baseConnection) { SqlCommand select = new SqlCommand("SELECT * FROM TABLE", baseConnection); baseConnection.Open(); SqlDataReader reader = select.ExecuteReader(); //... other irrelevant code } 打开它时连接没有打开?

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

3 个答案:

答案 0 :(得分: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变量为空,它将创建新实例。

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

答案 1 :(得分:1)

您的代码应为:

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

                //... other irrelevant code
            }

答案 2 :(得分:0)

$('.ui-dialog-buttonset .save').one('click', function() {
    $('.ui-dialog-buttonset button').prop('disabled',true);

    $.ajax({
        url: 'save.php',
        dataType: 'json',
        success: function(error) {
            $('.ui-dialog-buttonset button').prop('disabled',false);
            if (error) {
                alert(error);
            } else {
                window.location = 'index.php';
            }
        },
        error: function(xhr, ajaxOptions, thrownError) {
            alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
        }
    });
});