2013-04-10 73 views
2
  1. 使用System.Data.SqlClient命名空间cosnidered managed or umanaged code在C#progamm中执行查询吗?是System.Data.SqlClient代码的托管代码?

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

+0

查询在SQL Server或任何其他数据库系统上执行 - 这些系统通常不是托管代码库... – 2013-04-10 16:13:25

+0

您是出于好奇还是因为您有特定的问题需要您此信息为?如果确实有问题,最好直接描述一下。 – Pondlife 2013-04-10 16:28:29

+0

@Pondlife我在C#中有一个项目,我打开了数倍于sql的conn's。我想知道,如果每次关闭conn,资源都会重新启用,或者我必须使用Dispose方法。此外,我要求Q1在每次查询后需要实现我自己的dispose方法来释放资源。 – apomene 2013-04-10 16:32:49

回答

1

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

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

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

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

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语句,它们将在使用块后处理。

+0

所以不需要使用Dispose()是否正确? – apomene 2013-04-10 16:19:46

+0

@apomene:看我的编辑 – KF2 2013-04-10 16:23:36

+0

@apomene:看我的新编辑 – KF2 2013-04-10 16:40:17