Как зыкрыть соединение SQLite и вернуть значение?

Есть такой код метода:

public bool CheckInputedLogin(string login)
{
    string query = "SELECT * FROM Accounts WHERE login = @login";

    try
    {
        command = DataBase.GetConnection().CreateCommand();
        command.CommandText = query;
        command.Parameters.AddWithValue("@login", login);

        DataBase.OpenConnection();
        reader = command.ExecuteReader();

        return reader.HasRows; // gets a value indicating whether the reader contains one or more lines
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Ошибка:\n\"{ex.Message}\"\n" +
                        $"Обратитесь к системному администратору для её устранения.",
                        "Ошибка работы с базой данных", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }

    DataBase.CloseConnection();
    return false;
}

Соль в том, что закрытие соединения с БД идёт только перед возвращением false в конце. Как закрыть соединение из блока try? Перед return reader.HasRows закрыть нельзя, метод будет работать неправильно. А после не имеет смысла.


Ответы (1 шт):

Автор решения: rotabor
public bool CheckInputedLogin(string login)
{
    string query = "SELECT * FROM Accounts WHERE login = @login";
    bool result = false;
    try
    {
        command = DataBase.GetConnection().CreateCommand();
        command.CommandText = query;
        command.Parameters.AddWithValue("@login", login);

        DataBase.OpenConnection();
        reader = command.ExecuteReader();

        result = reader.HasRows; // gets a value indicating whether the reader contains one or more lines
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Ошибка:\n\"{ex.Message}\"\n" +
                        $"Обратитесь к системному администратору для её устранения.",
                        "Ошибка работы с базой данных", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }

    try { DataBase.CloseConnection(); } catch { }
    return result;
}

Ещё есть вариант

public bool CheckInputedLogin(string login)
{
    string query = "SELECT * FROM Accounts WHERE login = @login";
    try
    {
        command = DataBase.GetConnection().CreateCommand();
        command.CommandText = query;
        command.Parameters.AddWithValue("@login", login);

        DataBase.OpenConnection();
        reader = command.ExecuteReader();

        return reader.HasRows; // gets a value indicating whether the reader contains one or more lines
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Ошибка:\n\"{ex.Message}\"\n" +
                        $"Обратитесь к системному администратору для её устранения.",
                        "Ошибка работы с базой данных", MessageBoxButtons.OK, MessageBoxIcon.Stop);
        return false;
    }

    finally { DataBase.CloseConnection(); }
}

Здесь finally выполняется всегда после завершения try или catch.

→ Ссылка