1

Я хотел бы знать, что может быть лучшим подходом, чтобы открыть SqlConnection с помощью базы данных Sql Server 2008R2 Express Edition. Эта версия Sql имеет ограничения использования ОЗУ и использования ЦП, поэтому мы должны принять что-то лучшее, чтобы открыть SqlConnection.Что лучше всего подходит для открытия/закрытия SqlConnection в C#

Прямо сейчас я проверяю соединение при запуске и окончании каждого метода. Вот пример этого.

private void CheckValidId(string Id) 
    { 
     CheckConnectionStatus(); 

     try 
     { 
      sqlConnection.Open(); 
      sqlCommand = new SqlCommand("select * from ValidId where [email protected]", sqlConnection); 
      sqlCommand.Parameters.AddWithValue("@id", Id); 
      sqlDataReader = sqlCommand.ExecuteReader(); 
      While (sqlDataReader.Read()) 
      { 
       string Test = sqlDataReader["Id"].toString(); 
       MessageBox.Show("Value of Id : " , Test); 
      } 
     } 
     catch (Exception exp) 
     { 
      MessageBox.Show(exp.Message.ToString(), "Exception in CheckValidId"); 
     } 
     finally 
     { 
      CheckConnectionStatus(); 
     } 
    } 

Вот CheckConnectionStatus Метод

private void CheckConnectionStatus() 
    { 
     if (sqlConnection.State == ConnectionState.Open) 
     { 
      sqlConnection.Close(); 
     } 
    } 

Что наилучший подход для выполнения этой операции.

Благодаря

+0

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

+0

@SimonPrice благодарит человека –

ответ

2

Ваш шаблон для открытия и закрытия является правильным. Однако вы должны заметить, что это не открывает и не закрывает соединение с SQL Server, поэтому на самом деле не затрагивает ваши проблемы в отношении использования памяти и процессора - на самом деле это не имеет никакого значения.

Что такое Open and Close is is lease и возвращает соединение с пулом соединений ADO на клиентском ПК. Это означает, что закрытие соединения ADO не гарантируется (и в большинстве случаев не будет) закрывать и освобождать соединение с SQL Server. Это связано с тем, что установление и аутентификация соединения относительно дорогое и медленное, поэтому пул соединений ADO поддерживает ваши соединения в пуле, все еще открытые, на случай, если вы хотите восстановить соединение.

В чем отличие SQL Server - это количество одновременных запросов, которые необходимо выполнить, - и размер набора данных для запросов, а также общий размер данных в базе данных.

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

На практике мой опыт с выпусками SQL Express заключается в том, что вы не заметите никакой разницы между ним и полной версией SQL Server, если вы не выполняете некоторые очень конкретные вещи;

1) Написание инструмента стиля BI, который позволяет пользователю создавать пользовательские или пользовательские запросы. 2) Написание ужасного SQL - «большой SQL» может замаскировать ваш плохой синтаксис запросов, но Express не сможет, потому что у него меньше доступной оперативной памяти.

Если вы напишете эффективный, ограниченный SQL, вы, вероятно, никогда не столкнетесь ни с одним из ограничений SQL Express.

+0

спасибо, что ответив в деталях. У меня есть максимум 10 запросов, которые работают непрерывно. Я чувствую проблемы с производительностью с двух месяцев. Я думаю, что есть какой-то тупик. Coz, когда я перезапускаю сервер, все будет нормально. Как вы думаете, это проблема с 'Экспресс-ограничение версий'?. Должен ли я обновить его до «стандартной версии» или мне нужно перепроверить мой C# для любой лазейки? –

+0

У вас есть 10 параллельных запросов или 10 запросов, которые вы используете в цикле? Если его 10 запросов выполняются в цикле, то SQL Express не является вашей проблемой. Даже если у вас есть 10 одновременных запросов, работающих бесконечно, я бы не ожидал, что SQL Express тоже будет иметь проблемы с этим. Перезагрузка сервера не должна иметь никакого значения. Попробуйте все обычные вещи (например, Windows Performance Monitor, SQL Server Profiler), чтобы узнать, что происходит на вашем сервере. – PhillipH

5

Просто используйте using как он избавляется от связи один раз сделали.

using(SqlConnection conn = new SqlConnection("Connection string")){ 
    //do sql stuff 
    conn.Open(); 
    //etc etc 
    conn.Close(); 
} 
+0

Спасибо человеку за ваше предложение –

+1

Примечание: 'conn.Close();' не является обязательным, так как при удалении соединения он автоматически закрывает соединение – FakeCaleb

2

Вы хотите использовать одноразового использования шаблона, чтобы гарантировать, что все закрыто и утилизированы должным образом:

var query = "select * from ValidId where [email protected]"; 

using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString)) 
using (var command = new System.Data.SqlClient.SqlCommand(query, conn)) 
{ 
    command.Parameters.Add("@id", SqlDbType.Int).Value = Id; 
    conn.Open; 

    using (var reader = command.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      string Test = reader["Id"].ToString(); 
     } 
    } 

    command.Parameters.Clear(); 
} 

Вам не нужно, чтобы проверить состояние соединения; он будет закрываться, когда он будет удален.

Следует отметить, что лучше всего указать типы данных параметров. Я предположил, что в вашем случае SqlDbType.Int, но вы можете изменить его на все, что есть на самом деле.

Еще одно замечание: вы не хотите делать слишком много внутри читателя во время цикла. Вы хотите построить свою коллекцию или что-то еще и выйти оттуда. Чем короче ваше соединение, тем лучше. Это связано с тем, что вы потенциально можете заблокировать чтение некоторых строк в базе данных, которые могут повлиять на других пользователей и их приложения.

+1

Соединение должен быть открыт вручную, если вы не используете метод Fill() в адаптере данных, который автоматически открывает (и закрывает) его для вас. Что вы используете адаптер в вашем примере? Кажется, он не используется? –

+1

@ DanDef - Да, я адаптировал фрагмент, который использует адаптер данных для чтения данных для этого вопроса; моя вина. Я не знал, что ExecuteReader не открывает соединение, хорошо знать. –

+0

@ rory.ap есть эффект использования Statement на производительность? Я имею в виду, если я буду использовать Using Statement, это ускорит мое приложение? –

Смежные вопросы