如果我已经在 C# 中使用了 using 语句,我还需要使用 .Open() 和 .Close() 吗?

问题描述 投票:0回答:1

我是 Npgsql 的新手,我的 C# 代码如下:

我还需要用吗:

conn.Open(); conn.Close();

如果我已经使用了 using 语句?,我尝试删除它但没有任何反应。

        try
        {
            using (NpgsqlConnection conn = new NpgsqlConnection(Models.AppSettings.PG_SQL.Connection_String))
            {
                conn.Open();  // do I still need this?, I remove it, but it still working properly

                try
                {
                   string sql = "Select * From mytable1"

                    using (var dr = conn.ExecuteReader(sql, new { } ))
                    {
                        if (dr.Read())
                        {
                            // do some process
                        }
                    }
                }
                catch (Exception e)
                {
                    Helper.SaveLogAsync("Learning.Test: " + e.ToString(), Models.Errs.ErrType.Err);
                }
                finally { }

                conn.Close(); // do I still need this?, I remove it, but it still working properly
            }

        }
        catch (Exception e)
        {
            Helper.SaveLogAsync("Learning.Test: " + e.ToString(), Models.Errs.ErrType.Err);
        }
        finally { }
npgsql
1个回答
0
投票

是的,在 C# 中使用

conn.Open()
语句时,您可以安全地删除
conn.Close()
using
。 using 语句确保在退出块时在
Dispose()
对象上调用
NpgsqlConnection
方法,它负责关闭连接。

没有

conn.Open()
conn.Close()
调用的代码:

try
{
    using (NpgsqlConnection conn = new NpgsqlConnection(Models.AppSettings.PG_SQL.Connection_String))
    {
        try
        {
            string sql = "Select * From mytable1";

            using (var dr = conn.ExecuteReader(sql, new { }))
            {
                if (dr.Read())
                {
                    // do some process
                }
            }
        }
        catch (Exception e)
        {
            Helper.SaveLogAsync("Learning.Test: " + e.ToString(), Models.Errs.ErrType.Err);
        }
    }
}
catch (Exception e)
{
    Helper.SaveLogAsync("Learning.Test: " + e.ToString(), Models.Errs.ErrType.Err);
}

在这种情况下,您不需要显式调用

conn.Open()
,因为如果连接尚未打开,
ExecuteReader
方法将自动打开连接。同样,您不需要调用
conn.Close()
,因为
using
语句负责处理连接,包括关闭它。

© www.soinside.com 2019 - 2024. All rights reserved.