我是 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),并将内存等返回到系统。
提前非常感谢。
干杯
史蒂夫
是的,您应该用
using
包装您的 SqlConnection。这意味着您可以删除finally块 - 处理连接也会将其关闭,之前不需要这样做。
从技术上讲,SqlCommand 不需要被处置,因为它们当前没有任何非托管资源,但出于安全考虑,最好始终处置任何 IDisposable 对象。
作为旁注,您可以使用冒号语法
using SqlCommand cmd = new SqlCommand(sql, conn);
而不是
using (SqlCommand cmd = new SqlCommand(sql, conn)) {}
降低压痕水平。当使用冒号语法时,处置将在周围块的末尾运行