看到一些数据访问层一些方法写成如下两种形式:
第一种形式;
public DataTable getDataTable(string strSQL)
{
try
{
open(); //打开数据库连接
数据库,操作
}
catch
{
异常
}
finally
{
if(Conn.state=ConncetionState.open)
{
Close(); //关闭数据库连接
}
}
}
第二种形式:
public DataTable getDataTable(string strSQL,string connString)
{
DataTable dt;
using (SqlConnection conn = new SqlConnection(connString))
{
//数据库操作;
return dt;
}
}这两种形式都可以打开和关闭数据库并返回一个datatable,请问那一种形式会更好.如果我想写一个数据库访问层的类,我应该采用那一种形式.在性能上,那一种会更好.请高手指点.
第一种形式;
public DataTable getDataTable(string strSQL)
{
try
{
open(); //打开数据库连接
数据库,操作
}
catch
{
异常
}
finally
{
if(Conn.state=ConncetionState.open)
{
Close(); //关闭数据库连接
}
}
}
第二种形式:
public DataTable getDataTable(string strSQL,string connString)
{
DataTable dt;
using (SqlConnection conn = new SqlConnection(connString))
{
//数据库操作;
return dt;
}
}这两种形式都可以打开和关闭数据库并返回一个datatable,请问那一种形式会更好.如果我想写一个数据库访问层的类,我应该采用那一种形式.在性能上,那一种会更好.请高手指点.
using会在编译的时候自动产生try catch
第二种应该算是2.0的标准做法.个人看法.using 可以确保使用using的变量在程序出现异常时,也可以销毁对象.这个就是using的魅力所在.
{
try
{
...
}
catch
{
...
}
}这不是捕获异常吗?
{
using (...)
{
...
}
}
catch
{
...
}这不也是捕获异常吗?
第二种应该算是2.0的标准做法.个人看法.using 可以确保使用using的变量在程序出现异常时,也可以销毁对象.这个就是using的魅力所在.
{
}==try
{
IDisposable obj = new IDisposableImpl();
}
finally
{
obj.Dispose();
}虽然你表面上频繁的关闭打开链接 看似消耗系统资源
其实.net在幕后为你做了很多优化工作
快```
另外呢,封装之后,多几行代码也没有什么累呀。你不会每次写项目的时候都写一遍这些函数吧。
在QQ群上的一好友这样说:分析:
第一种:如果出现异常可以保证数据库连接的关闭,不影响其他使用
缺点:各种资源需要自己控制释放
第2种:资源使用完毕后直接释放
缺点:第一种的优点
推荐:综合
————————————————————————————————————————说第一种的优点是第二种的缺点是不对的。使用using,即使不捕获异常,也会在异常抛出时关闭并且释放连接。
——————————————————————————————————————————
如果你需要提前销毁什么,那么就可以写在using里。例如:using (SqlConnection conn = new SqlConnection(connString))
{
.......
using( SqlCommand cmd=new SqlCommand("select * from table",conn))
{
.......
}
}可见using是个工具,并没有不让你用(来销毁),只是你不用而已。但是正像这个局部变量cmd所显示的,什么是由销毁它又有谁关心呢?因为我们关心conn会不会因为程序员不小心少写了一个close()或者dispose(),所以才关心使用using来结构化它,让结构来保证逻辑一致。
————————————————————————————————————————
不对。这个说法没有区分逻辑连接还是物理连接。实际上仅对逻辑连接才需要尽快关闭,对物理连接需要尽量推迟关闭并且尽量复用。如果你使用一种数据库引擎的DBConnection的子类,它不自动支持连接池功能,你就不应该频繁开关connection,给你的编程建议与SqlCnnection绝对完全想反。
强烈支持第一种,这样就不夫对别人暴露出你的程序出错的问题,就会减少被人攻击的机会了。
多几个代码无咩,多点用COPY就很快补回来的。
{
.......
using( SqlCommand cmd=new SqlCommand("select * from table",conn))
{
.......
}
}
==================using 也可以嵌套呀,长见识了。但是这么写不乱吗?
用try只不过是多写几行代码罢了,但是不会乱。using嵌套的话,代码不见得少多少,相反,更乱了。
public DataTable getDataTable(string strSQL)
{
try
{
open(); //打开数据库连接
数据库,操作
}
catch
{
异常
}
finally
{
if(Conn.state=ConncetionState.open)
{
Close(); //关闭数据库连接
}
}
} 第二种形式:
public DataTable getDataTable(string strSQL,string connString)
{
DataTable dt;
try
{
using (SqlConnection conn = new SqlConnection(connString))
{
//数据库操作;
return dt;
}
}
catch
{
异常
}
}这才不容易让不喜欢理解问题要点的人揪住所谓的“是否捕获异常”这个毫不相干的问题。如果我们把程序员都看作人,而不是机器,我们从人性的角度出发,就能看出地第种写法非常伟大。当有这种语法出现的时候,“忘记关闭数据库连接”是不可能发生的,除非根本没有打开连接,从而解放了程序员的责任。
不要小看第2种的少写一个Close的意义.尤其在代码质量不够高的时候.
我是组合一起用的.楼上oldmoon说using会在编译的时候自动产生try catch,好像没有这样吧?如果using语句块没有用try语句处理的话,出错时只是FrameWork抛出异常而以.不过有一句经典的话:越傻瓜式的就越没效率.using肯定会牺牲一点效率,如果一定要效率还是汇编好(^^)我的理解,不知对不对