C# Data Connections Лучшая практика?

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

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

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

Однако рассматриваемый сценарий заключается в том, как подключиться к базам данных. Я использую 2 базы данных 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. Таким образом, соединение никогда не открывается очень долго, просто когда это необходимо. Конечно, это означает, что существует много обращений к методам открытого соединения. Так что это лучший способ реализовать такой сценарий или есть лучшие способы?

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

2 ответа

Решение

Соединения объединяются в.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.    
        {
             ...
        {
    }
}

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

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

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

Другие вопросы по тегам