System.Data.SqlClient代码是托管代码吗?

时间:2013-04-10 16:02:44

标签: c# sql-server managed unmanagedresources

  1. 使用System.Data.SqlClient命名空间在C#progamm中执行查询是否包含托管或非托管代码?

  2. 每次关闭连接时,都会使用(conn.Close()方法)是否考虑释放资源,或者我们必须将其处置以便释放?

2 个答案:

答案 0 :(得分:1)

关于第二个问题:

Close方法回滚所有待处理的事务。然后,它会释放与连接池的连接,或者在禁用连接池时关闭连接。

<强>被修改

以下示例创建一个SqlConnection,打开它,显示它的一些属性。连接在使用块结束时自动关闭。

private static void OpenSqlConnection(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
        Console.WriteLine("State: {0}", connection.State);
    }
}

<强>被修改

您需要为您创建的每个实现IDisposable的对象使用。其中包括SqlCommandSqlConnection。如果您使用using语句,则会在使用阻止后进行处置。

答案 1 :(得分:1)

System.Data.SqlClient本身是托管代码。但是,它建立在其他几个库之上。其中一些是托管代码,一些不是。

  1. 查询本身由数据库执行。因此,查询的文本(在程序中硬编码的部分)将被视为托管代码,但是一旦将命令发送到数据库,就不再对其进行管理。

  2. 执行.close命令后,连接本身将从.net应用程序中释放并返回到连接池(OLEDB,ODBC和/或其他子系统的一部分)。此时,释放连接并释放非托管部分。 Dispose将执行所有关闭操作并释放其他托管部分(连接字符串等)。

  3. 在任何实现它的对象上调用dispose总是一个好主意(或者将它包装在一个using块中,如@IRSOG所示)。在这种情况下,只调用close()并不是特别危险。我不会养成这个习惯。