Передовая практика соединений с данными С#?

Хорошо, так что это одна из таких упрямых тем, но основанная на ваших знаниях, мнениях и текущей практике, как лучше всего настроить следующий сценарий?

Я создаю обширное приложение для ввода данных, и обширным я имею в виду, что у меня есть только базовая настройка, которая включает около 15-25% от общей программы, и у меня есть около 15 форм, которые частично настроены. (Они все еще нуждаются в работе). Я использую SQL Compact 4.0 в качестве моей бэкэнд-базы данных, мне не нужна более обширная база данных, так как я не храню данные о количестве MMO, и на данный момент это только локальное приложение.

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

Однако рассматриваемый сценарий связан с подключением к базам данных. Я использую две базы данных SQLCE, в которой хранятся постоянные данные, основанные на службах и персонале, и секунда, в которой хранятся постоянно изменяющиеся данные или новые данные, введенные на основе первой базы данных. Я видел много разных методов, как установить это, и в настоящее время я использую тот, в котором у меня есть BaseForm, из которого наследуются все остальные формы. Внутри BaseForm у меня есть методы и переменные, которые являются общими для многих форм, таким образом сводя к минимуму количество повторяющегося кода.

Сюда входят строки подключения к обеим базам данных и 2 метода, которые открывают соединение с любым из них. Например:

internal SqlCeConnection dataConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_data.sdf");
internal SqlCeConnection logConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_logs.sdf");
internal SqlCeCommand command;

internal void openDataConnection() // Opens a connection to the data tables 
        {
            try
            {
                if(dataConn.State == ConnectionState.Closed)
                    dataConn.Open();
            }
            catch(SqlCeException ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        internal void openLogConnection() // Opens a connection to the log tables
        {
            try
            {
                if(logConn.State == ConnectionState.Closed)
                    logConn.Open();
            }
            catch (SqlCeException ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

Тогда всякий раз, когда мне нужно открытое соединение, я просто вызываю метод открытого подключения, соответствующий базе данных, к которой мне нужен доступ, и затем закрываю ее в объявлении finally. Таким образом, соединение никогда не открывается очень долго, просто, когда это необходимо. Конечно, это означает, что есть много вызовов методов открытых подключений. Так это лучший способ реализовать такой сценарий, или есть ли лучшие способы?

Лучше ли просто открыть соединение, как только будет загружена форма, а затем закрыть ее, когда форма закрывается? У меня есть случаи, когда несколько форм открыты одновременно, и каждому из них, вероятно, потребуется открытое соединение с базами данных, поэтому, если он закроет его, остальные будут правильно навинчены? Или мне нужно открыть соединение с обеими базами данных при запуске приложения? Любой вход был бы оценен. Спасибо.

Ответы

Ответ 1

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

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

Эффективный способ сделать это автоматически - с инструкциями using:

using (SqlConnection conn = new SqlConnection(...))
{
    using(SqlCommand cmd = new SqlCommand(..., conn))
    {
        conn.Open();
        using(DataReader dr = cmd.ExecuteReader())  // or load a DataTable, ExecuteScalar, etc.    
        {
             ...
        {
    }
}

Таким образом, ресурсы закрываются и удаляются, даже если выбрано исключение.

Короче говоря, открытие соединения при открытии приложения или при открытии каждой формы, вероятно, не самый лучший подход.

Ответ 2

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