У меня была точно такая же проблема, как и у вас. Было огромное приложение, которое я начал делать многопоточным. Преимущество, связанное с тем, что одно соединение открыто и используется повторно, заключается в том, что вы можете запрашивать данные у БД несколько раз, поскольку новое соединение создается по запросу (не нужно ждать, пока другие потоки завершат получение данных), и, например, если вы потеряете соединение с sql и это может произойти, когда сеть отключается на секунду или две), вы должны всегда проверять, открыто ли соединение, прежде чем отправлять запрос.
Это мой код для получения строк базы данных в MS SQL, но другие вещи должны выполняться точно так же. Имейте в виду, что sqlConnectOneTime (строка varSqlConnectionDetails) имеет недостаток возврата нуля, когда нет соединения, поэтому он нуждается в некоторых модификациях для ваших нужд, или запрос не будет выполнен, если sql не сможет установить соединение. Вам просто нужно добавить правильную обработку кода :-) Надеюсь, это будет полезно для вас: -)
public const string sqlDataConnectionDetails = "Data Source=SQLSERVER\\SQLEXPRESS;Initial Cata....";
public static string sqlGetDatabaseRows(string varDefinedConnection) {
string varRows = "";
const string preparedCommand = @"
SELECT SUM(row_count) AS 'Rows'
FROM sys.dm_db_partition_stats
WHERE index_id IN (0,1)
AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0;";
using (var varConnection = Locale.sqlConnectOneTime(varDefinedConnection))
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection))
using (var sqlQueryResult = sqlQuery.ExecuteReader())
while (sqlQueryResult.Read()) {
varRows = sqlQueryResult["Rows"].ToString();
}
return varRows;
}
public static SqlConnection sqlConnectOneTime(string varSqlConnectionDetails) {
SqlConnection sqlConnection = new SqlConnection(varSqlConnectionDetails);
try {
sqlConnection.Open();
} catch (Exception e) {
MessageBox.Show("Błąd połączenia z serwerem SQL." + Environment.NewLine + Environment.NewLine + "Błąd: " + Environment.NewLine + e, "Błąd połączenia");
}
if (sqlConnection.State == ConnectionState.Open) {
return sqlConnection;
}
return null;
}
Описание:
Определена одна глобальная переменная с ConnectionDetails вашего SQL Server
Один глобальный метод для установления соединения (вам нужно обработать ноль там)
Использование using
для удаления соединения, SQL-запроса и всего, когда метод чтения / записи / обновления выполнен.