是否可以通过其他方法关闭SQLite数据库连接?

时间:2019-04-20 02:47:21

标签: c# sqlite

SQLite DB连接帽可以用一种方法打开而不关闭,而可以用后一种方法关闭吗?我需要以编程方式进行此操作。

private void SetConnection()

    {
        SQLiteConnection con;
        SQLiteDataAdapter da;
        SQLiteCommand cmd;
        DataSet ds;

        if (!File.Exists("data.db"))
        {
            SQLiteConnection.CreateFile("data.db");

            string sql = @"CREATE TABLE Sites(
                           ID INTEGER PRIMARY KEY AUTOINCREMENT ,
                           SiteName            TEXT      NOT NULL,
                           IpAddress           TEXT       NOT NULL,
                           PortNo              TEXT       NOT NULL,
                           AuthType            TEXT       NOT NULL
                        );";
            con = new SQLiteConnection("Data Source=data.db;Version=3;");
            con.Open();
            cmd = new SQLiteCommand(sql, con);
            cmd.ExecuteNonQuery();

//I want to leave this out  -- con.close();
// and close it later on in a different method

这甚至可能吗?这样做有危险吗?

1 个答案:

答案 0 :(得分:1)

关闭连接是该类本机处理方法的一部分,但是,它不是一种特别干净的方法,并且从其他端点的角度来看,作为无响应客户端,它也非常相似。

只要您拥有执行处置所需的对象的引用,就可以从任何地方正确处置DB上下文。有几种方法可以做到这一点。

首先,只是将引用分配给您希望执行关闭操作的对象。您需要创建一种情况,数据库上下文和您希望执行关闭操作的对象都在作用域中同时存在,但这就是您在某处进行初始化时要处理的事情。

提示,这正是您可能要为要管理上下文的任何类型创建构造函数的类型。

对于更复杂的场景,例如,如果您不确定从何处处理数据库上下文,以及是否要使其更加灵活和通用,则需要完成一些委托魔术,都将类似于函数式编程。

您需要创建一系列代表来处理一些工作,其中的数量将取决于您的工作参数的健壮程度。

首先,您需要在数据库上下文中有一个实际处理处置的方法,然后您可以将其作为处理程序分发给其他对象,该处理程序可以在范围外调用以实际关闭连接。 / p>

根据您期望从任意作用域关闭连接的情况,您可能还需要第二种方法,每当您分配一个关闭连接的委托时,该方法就会被调用。这将存储能够关闭连接的委托,并且每当尝试关闭连接时,首先将所有委托从其各自的调用列表中删除,以确保在以后的实例中没有处理程序尝试指向已处置的对象。

但是,在这一点上,您将开始深入研究Threading的领域,除非删除和恢复整个数据库上下文的能力很重要,否则您可以使用预期类型的​​引用或Handler进行抓取在运行时之前期望的类型是任意的。