Вот и все. Некоторые дополнительные моменты для рассмотрения:
- Где вы получаете строку подключения? Вы не хотите, чтобы это было жестко запрограммировано повсеместно, и вам, возможно, придется его обезопасить.
- Вам часто приходится создавать другие объекты, прежде чем вы действительно используете соединение (
SqlCommand
, SqlParameter
, DataSet
, SqlDataAdapter
), и вы хотите подождать как можно дольше, чтобы открыть соединение . Полный шаблон должен учитывать это.
- Вы хотите убедиться, что доступ к вашей базе данных принудительно связан с собственным классом слоя данных или сборкой. Поэтому обычно нужно выразить это как вызов частной функции:
.
private static string connectionString = "load from encrypted config file";
private SqlConnection getConnection()
{
return new SqlConnection(connectionString);
}
А затем напишите свой пример так:
using (SqlConnection sqlConn = getConnection())
{
// create command and add parameters
// open the connection
sqlConn.Open();
// run the command
}
Этот образец может существовать только в вашем классе доступа к данным. Альтернатива - пометить его internal
и распределить слой данных по всей сборке. Главное, что строгое разделение кода вашей базы данных строго соблюдается.
Реальная реализация может выглядеть так:
public IEnumerable<IDataRecord> GetSomeData(string filter)
{
string sql = "SELECT * FROM [SomeTable] WHERE [SomeColumn] LIKE @Filter + '%'";
using (SqlConnection cn = getConnection())
using (SqlCommand cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.Add("@Filter", SqlDbType.NVarChar, 255).Value = filter;
cn.Open();
using (IDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
yield return (IDataRecord)rdr;
}
}
}
}
Обратите внимание, что я также смог "сложить" создание объектов cn
и cmd
, и таким образом сократить вложенность и создать только один блок области видимости.
Наконец, предостережение об использовании кода yield return
в этом конкретном примере. Если вы вызываете метод и не завершаете ваше DataBinding
или другое использование сразу, это может держать соединение открытым в течение длительного времени. Примером этого является использование его для установки источника данных в событии Load
на странице ASP.NET. Поскольку фактическое событие привязки данных не произойдет до тех пор, пока вы не сможете удерживать соединение открытым гораздо дольше, чем необходимо.