调用SMO服务器和数据库后清理

Kje*_*sen 5 asp.net smo sql-server-2008

你如何让SMO发布它的连接?

我有这个代码:

public static class SqlServerConnectionFactory
{
    public static Server GetSmoServer()
    {
        using (var c = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
        {
            var s = new ServerConnection(c);
            c.Close();
            return new Server(s);
        }
    }

    public static Database GetSmoDatabase(Server server)
    {
        var db = server.Databases[ConfigurationManager.AppSettings["Database"]];
        db.AutoClose = true;
        return db;
    }
}
Run Code Online (Sandbox Code Playgroud)

从IIS中运行的ASP.Net MVC应用程序调用这样的:

public ActionResult Index()
    {
        server = SqlServerConnectionFactory.GetSmoServer();
        database = SqlServerConnectionFactory.GetSmoDatabase(server);
        var vm = new SettingsIndexViewmodel(database);
        return View(vm);
    }
Run Code Online (Sandbox Code Playgroud)

对于我对此索引方法进行的每次调用,都会启动连接 - 并且不会再次释放.

所以在20次调用页面后,我有20个等待命令的连接.当我无法建立新连接时,最终会出现异常,因为连接池已满.

sp_who的

我需要做些什么来避免这种情况发生?我似乎无法在SMO Server对象上找到像Dispose,close或类似的方法.

Gar*_*ett 7

MSDN文章Disconnecting from an Instance of SQL Server可能会提供一些帮助.它指出:

连接方法被调用时,连接不是自动释放.该断开方法必须显式调用释放到连接池的连接.此外,您可以请求非池化连接.您可以通过设置引用ServerConnection对象的ConnectionContext属性的NonPooledConnection属性来 执行此操作

  • 这有效。我刚刚在完成服务器对象后调用了这个:server.ConnectionContext.Disconnect(); (2认同)