我有这样下面的代码来检索数据库数据,当我从Visual Studio中运行代码分析,它表明我调用Dispose方法SqlConnection,DataTable和SqlDataAdapter对象.
SqlConnection sqlconn = new SqlConnection(ConfigurationManager.ConnectionStrings["connstr"].ConnectionString);
SqlCommand cmd = sqlconn.CreateCommand();
cmd.CommandText = "SELECT * FROM tbl_serial WHERE serial = @serial";
cmd.Parameters.AddWithValue("@serial", txtQuery.Text);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
try
{
sqlconn.Open();
da.SelectCommand = cmd;
da.Fill(dt);
}
catch (SqlException ex)
{
lblStatus.Text = ex.Message;
}
finally
{
sqlconn.Close();
}
if (dt.Rows.Count > 0)
{
lblStatus.Text = "FOUND!";
}
else
{
lblStatus.Text = "NOT FOUND!";
}
Run Code Online (Sandbox Code Playgroud)
这是我第一次这样做,我sqlconn就像这样调用dispose方法-
finally
{
sqlconn.Close();
sqlconn.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
但是,Visual Studio警告我这样 -
CA2202:Microsoft.Usage:对象'sqlconn'可以在方法'test_search.Unnamed1_Click(object,EventArgs)'中多次处理.为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose:Lines:41
所以我想知道何时应该正确调用dispose方法.
不是dispose直接调用,而是使用using语句,当代码执行移出其关联的块时,它将确保为您执行此操作.例如:
SqlConnection con;
using (con = new SqlConnection(/* ... */)) {
// Do your stuff with `con`
}
Run Code Online (Sandbox Code Playgroud)
这是一般用于一次性用品的模式.