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