是System.Data.SqlClient代码的托管代码?
问题描述:
使用System.Data.SqlClient命名空间cosnidered managed or umanaged code在C#progamm中执行查询吗?是System.Data.SqlClient代码的托管代码?
每次关闭连接时,都会使用
(conn.Close()
方法)资源是否会考虑释放,或者我们必须将其释放才能释放?
答
System.Data.SqlClient本身是托管代码。但是,它建立在其他几个图书馆之上。其中一些是托管代码,另一些则不是。
查询本身由数据库执行。因此,查询文本(在您的程序中硬编码的部分)将被视为托管代码,但是一旦该命令被发送到数据库,它就不再被管理。
执行.close命令后,连接本身将从.NET应用程序释放并返回到连接池(OLEDB,ODBC和/或其他子系统的一部分)。此时,连接被释放,非托管部分被释放。 Dispose将完成所有关闭并释放其他托管部分(连接字符串等)。
在任何实现它的对象上调用dispose总是一个好主意(或者将它包装在使用块中,如@IRSOG所示)。在这种情况下,调用close()并不是特别危险。我不会养成它的习惯。
答
关于第二个问题:
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。这包括SqlCommand
和SqlConnection
。如果使用using
语句,它们将在使用块后处理。
查询在SQL Server或任何其他数据库系统上执行 - 这些系统通常不是托管代码库... – 2013-04-10 16:13:25
您是出于好奇还是因为您有特定的问题需要您此信息为?如果确实有问题,最好直接描述一下。 – Pondlife 2013-04-10 16:28:29
@Pondlife我在C#中有一个项目,我打开了数倍于sql的conn's。我想知道,如果每次关闭conn,资源都会重新启用,或者我必须使用Dispose方法。此外,我要求Q1在每次查询后需要实现我自己的dispose方法来释放资源。 – apomene 2013-04-10 16:32:49