public static object GetSingle(string SQLString, OleDbParameter[] cmdParms, bool isProc = false)
{
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
using (OleDbCommand cmd = CreateCommand(connection, SQLString, cmdParms, isProc))
{
try
{
object obj = cmd.ExecuteScalar();
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
return null;
}
else
{
return obj;
}
}
catch (System.Data.OleDb.OleDbException e)
{
throw new Exception(e.Message);
}
}
}
}
我的疑问是如果抛出异常,执行throw语句后,using语句还会自动释放OleDbConnection 和OleDbCommand 吗?还是必须在finally语句里手动释放?
------解决思路----------------------
using里的东西总是会释放的,不管是有异常还是return
------解决思路----------------------
会释放。
但是写
catch (System.Data.OleDb.OleDbException e)
{
throw new Exception(e.Message);
}
这是干啥?故意让vs的调试器不能专注地定位到调试语句和调用堆栈上?还是不想让程序员调试bug时看到InnerException?
否则你捕获错误,然后抛出一个e.Message信息,这样不但是画蛇添足(没有完全隐瞒异常反而)重复抛出异常而且也丧失了及时调试bug的能力啊?!
------解决思路----------------------
这里的using 本质就是try catch 你可以百度一下
另外 这段代码很多余
catch (System.Data.OleDb.OleDbException e)
{
throw new Exception(e.Message);
}
------解决思路----------------------
using是一个语法糖,本身它会转换成一个try finally
而调用dispose是在finally中,所以不要担心。
------解决思路----------------------
你可以用反编译工具类似于reflector看一下using编译后的代码 一目了然~~~~
------解决思路----------------------
我对于
catch (System.Data.OleDb.OleDbException e)
{
throw new Exception(e.Message);
}
这类代码的问题,与using本身无关,但是与你的问题背后的一些东西有关。
有些人说“为了能够知道是哪一段代码有问题,所以需要这样写try...catch”。这纯粹是错误的方法宣传。当你的测试遇到异常时,你的vs进入调试状态中断状态时,你不但可以看到Exception、InnerException等等而且需要看调用堆栈,需要双击调用堆栈来返回至少1层(有时候需要7、8层)调用入口去查看所经历的代码,并且调试入口代码的变量值。
而那种说“写try...catch是为了更好地知道代码出错位置”的人,显然没有想帮别人进行这样的正规的调试训练,而是只想着发布后的产品在打印异常信息时的方便。我们不能为了发布后对用户隐藏真实的异常信息,而让我们再发、测试、调试时丧失调试能力。
你会发现using结构在抛出异常时仍然支持vs调试,而根本没有搞什么类似
throw new Exception(e.Message);这种隐瞒异常、忽略真实的异常语句(和调试可能性)、重复抛出异常的语句。而你特意加上这条语句,目的是要干什么呢?
------解决思路----------------------
这就不是“可以不可以使用try...catch”的问题。这就好像你问“在百货商场里能不能俩人吵架啊”?这时候人家就要问你“吵架干慢啊?是甲亢造成的么?”