Можно ли закрыть соединение с БД SQLite другим способом? - PullRequest
1 голос
/ 20 апреля 2019

Может ли соединение с БД SQLite открываться одним способом, а не закрываться, закрываться позже? У меня есть необходимость сделать это программно.

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 Ответ

1 голос
/ 20 апреля 2019

Закрытие соединения является частью метода удаления, встроенного в класс, однако это не особо чистый метод, и он довольно похож с точки зрения другой конечной точки как не отвечающий клиент.

Вы можете правильно распоряжаться контекстом БД из любого места, если у вас есть ссылка на объект, необходимый для выполнения удаления. Есть несколько способов сделать это.

Прежде всего, это просто присвоить ссылку любому объекту, который вы ожидаете выполнить операцию закрытия. Вам нужно будет создать ситуацию, когда и контекст БД, и объект, который вы ожидаете выполнить, существуют вместе в области видимости, но это то, что вы обрабатываете где-то при инициализации.

Подсказка, подсказка, это именно тот тип вещей, для которого вы, возможно, захотите создать конструктор для любого типа, который будет управлять вашим контекстом.

Для более сложного сценария, например, если вы не уверены, откуда будет обрабатываться контекст БД, и если вы хотите сделать его гораздо более гибким и универсальным, необходимо выполнить некоторую магию делегата, которая в все будет похоже на функциональное программирование.

Вам потребуется создать серию делегатов для обработки нескольких заданий, число которых будет зависеть от того, насколько надежны ваши параметры для работы.

Во-первых, у вас должен быть метод в контексте БД, который фактически обрабатывает удаление, которое затем вы можете передать другим объектам в качестве обработчика, который может быть вызван вне области действия для фактического закрытия соединения.

В зависимости от обстоятельств, при которых вы ожидаете закрытие соединения из произвольных областей, вы можете также захотеть второй метод, который вызывается всякий раз, когда вы назначаете делегата, который закрывает соединение. Это будет хранить делегатов, которые могут закрыть соединение, и всякий раз, когда соединение пытается закрыться, сначала все делегаты удаляются из их соответствующих списков вызовов, гарантируя, что в более поздних случаях никакие обработчики не будут пытаться указывать на объекты, которые были удалены.

Однако в этот момент вы начинаете углубляться в территорию Threading, и, если не важна возможность удаления и возобновления всего контекста базы данных, вы, скорее всего, можете использовать ссылку в ожидаемом типе или обработчик. ожидаемый тип является произвольным до времени выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...