And*_*rew 5 c# idisposable try-catch
我只是被建议将整个using块放在一个内部try,否则using范围将阻止异常被捕获.但是,using如果抛出异常,是否会阻止正确处理其资源?如果我有下面的代码,我应该把try块放在哪里?
using (connSQL = new SqlConnection(strConn))
{
connSQL.Open();
using (SqlCommand commSQL = new SqlCommand(strPreparedStatement, connSQL))
{
if (sqlParameters != null)
{
for (int i = sqlParameters.GetLowerBound(0); i <= sqlParameters.GetUpperBound(0); i++)
{
commSQL.Parameters.Add(sqlParameters[i]);
}
}
drSQL = commSQL.ExecuteReader();
dtReturn.Load(drSQL);
commSQL.Parameters.Clear();
}
}
Run Code Online (Sandbox Code Playgroud)
在此应用程序中,确保与数据库的连接不会因异常而开始累积更为重要.
该using声明将已阻止连接积聚-它的东西清除侧对你来说,通过有效地作为一个try/ finally与呼叫块Dispose的finally块.如果你也想要一个try/ catchblock,你可以把它放在里面或外面 - 但你确定它不应该在更高的水平吗?您实际上期望如何处理异常?
顺便说一句,目前还不清楚为什么要在命令即将被处理时清除命令中的参数...
我鼓励你在using语句中声明变量,这样你最终不会试图在块之外读取它们:
using (SqlConnection connSQL = new SqlConnection(strConn)) {
Run Code Online (Sandbox Code Playgroud)
通常,您希望尽可能缩小范围.哦,你也SqlDataReader应该using发表声明.无论如何,当你关闭连接和命令时,它可能无关紧要,但我会把它作为一个原则点 - 它实现IDisposable,所以你应该处理它.
哦,你的迭代方式sqlParameters目前相当长.foreach使它更简单,即使我不使用它,for (int i = 0; i < sqlParameters.Length; i++)除非我有理由相信它不是一个"简单"的数组.
所以,我的等效代码看起来像这样:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(strPreparedStatement, connection))
{
if (sqlParameters != null)
{
// If sqlParameter is an array, you can just use
// command.Parameters.AddRange(sqlParameters) instead
foreach (SqlParameter parameter in sqlParameters)
{
command.Parameters.Add(parameter);
}
}
using (SqlDataReader reader = command.ExecuteReader())
{
DataTable table = new DataTable();
// Perform any extra initialization here
table.Load(reader);
return table;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1544 次 |
| 最近记录: |