using (SqlConnection sqlConn = new SqlConnection(XYZ.Globals.ConnectionString))
{
using (SqlDataAdapter adapter = new SqlDataAdapter())
{
SqlCommand command = new SqlCommand("selCompanies", sqlConn)
{
CommandType = CommandType.StoredProcedure
};
command.Parameters.AddRange(searchParams.ToArray());
adapter.SelectCommand = command;
DataSet ds = new DataSet();
adapter.Fill(ds);
return ds;
}
}
Do I need to wrap the `adapter.fill()` in try catch finally block?
答案 0 :(得分:1)
当你可以处理它抛出的任何异常时,你只能在try/catch
中包装东西。如果不能,则无需将其放在try/catch
块中。
using
语句相当于try/finally
块。
答案 1 :(得分:1)
问题是如果出现问题我将采取哪些不同的方式。通常情况下,正确的操作只是让异常升级 - 毕竟,你不是期待异常,所以你不能对它做任何有用的事情。这里唯一的微妙之处是IDisposable
,你在那里积极地想要清理东西;所以对using
,SqlConnection
,SqlCommand
等内容的SqlDataReader
语句是理想的(但这是try
/ finally
,而不是{{1 }} / try
)。因此,我将制作游览代码的主要变化是处置命令:
catch
答案 2 :(得分:0)
这取决于此代码是否包含在更高级别的异常处理中。您希望在什么范围内处理此逻辑中的错误 - 通常这将是给定的逻辑“块”,而不是每个函数调用。处理数据库错误 一般来说是一个好主意。
在任何情况下,您都需要在using
上使用另一个SqlCommand
,否则您将泄露它。
答案 3 :(得分:0)
同样适用于adapter.Fill()
.net代码的任何其他行:
如果您有充分的理由捕获并处理一个特定的异常,那么抓住并处理它。如果你没有充分的理由,请不要抓住它。
我不明白为什么这个特定的行应该以特定的方式进行错误处理。
答案 4 :(得分:0)
如果您有错误处理需要连接或命令在范围内,您只需要从填充中捕获异常。
此外,从技术上讲,只要退出连接的使用块,适配器和命令就会超出范围。在许多情况下,这可能足以释放这些资源(在大多数情况下,连接是最有价值的资源,因为它会在数据库服务器上产生开销)。但是,要明确这一点并没有什么坏处,特别是如果您要为同一个连接创建多个命令或适配器。