gpt4 book ai didi

c# - 你如何将 "using"用于 npgsql 而不是 trycatchfinally?

转载 作者:行者123 更新时间:2023-12-05 05:38:50 24 4
gpt4 key购买 nike

在我之前的一个问题中,有人建议我不应该使用 trycatch 并在 finally 处关闭连接,而应该只使用“using”。有人可以给我举个例子吗?

我有这段代码,如何仅“使用”它?

            try
{
conn3.Open();
string sql_check = "SELECT (time_in) FROM timeinout WHERE employee_id = @employee_id AND date = @date";
using var cmd_check = new NpgsqlCommand(sql_check, conn3);

cmd_check.Parameters.AddWithValue("employee_id", id);
cmd_check.Parameters.AddWithValue("date", date);
cmd_check.Prepare();

var reader = cmd_check.ExecuteReader();

if (reader.Read())
{
return true;
}
else
{
return false;
}

}
catch
{
return false;
}
finally
{
conn3.Close();
}

最佳答案

using 不能替代 try...catch...finally。它使您能够取消 finally block ,但是,如果可以抛出异常,您仍然需要捕获它。 using block 保证创建的对象将被释放,无论是否抛出异常。这:

var obj = new SomeType();

try
{
// Use obj here.
}
catch
{
// Handle exception here.
}
finally
{
obj.Dispose();
}

可以并且应该替换为:

using (obj = new SomeType())
{
try
{
// Use obj here.
}
catch
{
// Handle exception here.
}
}

基本上,如果已经有异常处理,那么您仍然需要异常处理,但您不需要在 finally block 中关闭/处置本地创建的对象。如果您在 finally block 中执行任何其他操作,那么您仍然需要它。

在您的情况下,您应该使用 using 语句创建连接、命令和数据读取器:

using (var connection = new NpgsqlConnection(connectionString))
using (var command = new NpgsqlCommand(query, connection))
{
try
{
connection.Open();

using (var reader = command.ExecuteReader())
{
return reader.HasRows;
}
}
catch
{
return false;
}
}

数据读取器将在内部 using block 结束时关闭,连接将在外部 using block 结束时关闭。

关于c# - 你如何将 "using"用于 npgsql 而不是 trycatchfinally?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72851840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com