2014-12-03 25 views
2

我在C#中创建了一个程序,我创建了各种类,并且它们都需要调用数据库。所以我决定创建一个处理所有调用的静态类,以便我可以非常轻松地应用深远的变化。在这一类我有打电话的SqlCommandExecuteReader()等),我终于厌倦了重写所有的连接代码各部分功能,并抽象出来给叫getSqlCommand()另一个函数会返回一个初始化SqlCommand,我用它来执行各种命令。我选择不将SqlCommand传回给其他程序(尽管它是一种公共方法,以防我需要它),因为如果在将结果返回到程序之前做了一些预处理。当在另一个函数中使用SqlCommand时什么时候关闭?

我的问题是,如果/在SqlConnection关闭时?既然它被作为SqlCommand的返回值传回,它是否会被打开?如果是这样,我可以关闭它吗?这里有一些代码(稍微剥离下来),所以你可以看到我在做什么,在此先感谢!

的函数来创建SqlCommand

public static SqlCommand GetSqlCommand(string query) 
{ 
    using (SqlConnection dbConnection = new SqlConnection(SQLConn)) { 
     dbConnection.Open(); 
     SqlCommand cmd = new SqlCommand(query, dbConnection); 
     cmd.CommandTimeout = 0; 
     return cmd; 
    } 
} 

命令在静态类的使用的一个示例:

public static SqlDataReader executeReader(string query) 
{ 
    try { 
     return GetSqlCommand(query).ExecuteReader(); 
    } catch (SqlException) { 
     //Notify User and Resolve Error 
    } 

    return null; 
} 
+0

这难道不是错误?我会期望它错误,因为'SqlConnection.Dispose'通常会关闭。也许.NET的缓存连接正在节省您(.NET会缓存连接)。命令也应该在你完成之后处理掉。 – TyCobb 2014-12-03 17:36:36

+1

当您的代码片段退出代码片段中的'using'块时,它会自动关闭,呈现以半无用状态返回的'SqlConnection'。 – Michael 2014-12-03 17:36:58

回答

5

,当你调用一个DisposeSqlConnection关闭。退出using块即可。连接将被关闭。

这一切就是这么简单。它不会奇迹般地保持打开状态,因为ADO.NET不知道并且无法发现您返回了连接对象。

移出GetSqlCommand方法的连接。将连接对象传递给该方法。 GetSqlCommand在创建连接方面没有业务。它应该建立连接,使用它,但不能关闭它。

1

代码退出GetSqlCommand方法之前的连接关闭。这意味着它返回的命令对象是无用的。

using构造创建了一个try ... finally块,在块中它将连接放置在块的末尾。由于处置连接也会关闭连接,因此在将命令对象从方法返回给调用方之前,连接已关闭。

1

使用关键字等同用尝试终于,并最终阻止你的Connexion内将布置

SqlConnection dbConnection = new SqlConnection(SQLConn); 
    try 
    { 
     dbConnection.Open(); 
     SqlCommand cmd = new SqlCommand(query, dbConnection); 
     cmd.CommandTimeout = 0; 
     return cmd; 
    } 
    catch(Exception ex) 
    { 

    } 
    finally 
    { 
     dbConnection.Dispose(); 
    } 

而且即使是有try块内return语句,块终于就一定会执行

相关问题