如何正确使用SQL Connections的问题

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

我是 C# 新手,正在构建一个与 SQL 数据库交互并针对 SQL 数据库执行各种操作的应用程序。

这是我迄今为止用于执行这些任务的示例语法(例如,它使用数据库列表填充组合框)

private void button1_Click(object sender, EventArgs e)
{
   string connectionString = txtConnString.Text;
   SqlConnection conn = new SqlConnection(connectionString);
   try
   {
      string sql = "SELECT name FROM master.sys.databases;";
      conn.Open();
      SqlCommand cmd = new SqlCommand(sql, conn);
      SqlDataReader dr = cmd.ExecuteReader();
      while (dr.Read())
      {
         comboDatabaseList.Items.Add(dr[0]);
      }
      dr.Close();
      cmd.Dispose();
   }
   catch (SqlException ex)
   {
      MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon,Error);
   }
   finally
   {
      if (conn.State == ConnectionState.Open)
         conn.Close();
   }

}

但是,随着我不断学习和研究,我明白将 SQL 工作包装在

using
块中是最佳实践。

话虽如此,下面的内容是否更适合上面的内容,或者这是否太过分了?

private void button1_Click(object sender, EventArgs e)
{
    string connectionString = txtConnString.Text;
    string sql = "SELECT name FROM master.sys.databases;";
    using (SqlConnection conn = new SqlConnection(connectionString)
    {
        try
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        comboDatabaseList.Items.Add(dr[0]);
                    }
                    dr.Close();
                }
                cmd.Dispose();
            }
        }
        catch (SqlException ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon,Error);
        }
        finally
        {
            if (conn.State == ConnectionState.Open)
                conn.Close();
        }
    }
}

我只是想确保应用程序正确关闭所有内容(包括当我运行调试来测试应用程序时的 Visual Studio),并将内存等返回到系统。

提前非常感谢。

干杯

史蒂夫

c# sqldatareader sqlconnection sqlcommand
1个回答
0
投票

是的,您应该用

using
包装您的 SqlConnection。这意味着您可以删除finally块 - 处理连接也会将其关闭,之前不需要这样做。

从技术上讲,SqlCommand 不需要被处置,因为它们当前没有任何非托管资源,但出于安全考虑,最好始终处置任何 IDisposable 对象。

作为旁注,您可以使用冒号语法

using SqlCommand cmd = new SqlCommand(sql, conn);

而不是

using (SqlCommand cmd = new SqlCommand(sql, conn)) {}

降低压痕水平。当使用冒号语法时,处置将在周围块的末尾运行

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