我正在尝试使用带有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
}
打开它时连接没有打开?
我在整个网站上使用此连接,并且我想将它作为页面属性放在自定义基类中,因此我不必继续键入它。这是不允许的吗?
答案 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);
}
});
});