在书上看到这样一段代码:
myConn.Open();
try
{
myCmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw (ex);
}
finally
{
myCmd.Dispose();
myConn.Close();
}
SqlDataAdapter da = new SqlDataAdapter(myCmd);
DataSet ds= new DataSet();
da.Fill(ds, P_Str_srcTable);
我觉得有问题:
SqlDataAdapter da = new SqlDataAdapter(myCmd);
DataSet ds= new DataSet();
da.Fill(ds, P_Str_srcTable);
这一段我认为放try里面
但是书上好多地方都是上面那样用的
try
{
}
执行玩了不是就
finally
{
}
了吗?那样myCmd都Dispose()掉了
还可以SqlDataAdapter da = new SqlDataAdapter(myCmd);
想不明白,哪位解释一下好吗?
主要是我的标题没拟好,导致这么多人答非所问,老是要和try、catch、fianlly过不去,我的错!既然大家都在讨论try,finally.....我也说说:我提过,并不是总是执行finally块的!知道CLR吗?要是CLR停止工作,就不会执行finally块。所以不要太依赖finally块 ,应该在临界终结程序中清理临界资源以适应加速关闭的情况!
{
myCmd.ExecuteNonQuery();
}
上面这个部分的try块(大括号中的代码)是检测块中代码是否异常(或是错误),如果将以下代码(放入try中就是检测代码是否有错):
SqlDataAdapter da = new SqlDataAdapter(myCmd);
DataSet ds= new DataSet();
da.Fill(ds, P_Str_srcTable);
1.如果块内代码有错的话,就执行catch块:
catch (Exception ex)
{
throw (ex);
}
寻找匹配的异常,catch块执行完后就接着执行finally块以及其后语句:
finally
{
myCmd.Dispose();
myConn.Close();
}
SqlDataAdapter da = new SqlDataAdapter(myCmd);
DataSet ds= new DataSet();
da.Fill(ds, P_Str_srcTable);
2.如果try块中没有错误的话,catch块就不会执行,直接跳过去执行下面的代码(就好象catch块不存在一样)
总之:
try是用来检查块中代码是否有错误
catch代码是来确定出现的究竟是什么异常(暂时先这样说)
finally及其后语句无论什么情况都是要运行的
(希望能对你有些帮助)本回答被网友采纳
当然从根本上讲DataAdapter 与 DataSet还是会执行Open()与Close()和Dispose()方法,但是这些方法已经在DataAdapter 与 DataSet 类的内部封装好了,并不需要你在此处把他们写出来。
我感觉楼主的代码至少应该还有sqlcommand对象,如果再把这个对象贴出来,可能能更好理解 ,如果有了command对象 try语句只是说sqlcommand语句执行了没有,如果执行了走 finally 关闭所有连接
然后执行SqlDataAdapter对象 如果没有执行,则抛出异常。我感觉是这样理解,不知道对不对!
一家之言