それがほとんどです。考慮すべきいくつかの追加のポイント:
- 接続文字列はどこで入手できますか?いたるところにハードコーディングする必要はなく、セキュリティで保護する必要があるかもしれません。
- 多くの場合、接続(
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
ため、ネストを減らし、スコープブロックを1つだけ作成できたことに注意してください。
yield return
最後に、この特定のサンプルのコードの使用に関する注意事項。DataBinding
メソッドを呼び出して、自分やその他の使用をすぐに完了しないと、接続が長時間開いたままになる可能性があります。この例はLoad
、ASP.NETページのイベントでデータソースを設定するためにそれを使用することです。実際のデータバインディングイベントは後で発生するまで発生しないため、必要以上に長く接続を開いたままにしておくことができます。