はじめに
MVCモデルでアプリケーションを新規作成しています。
当然ながらDBに接続する必要があります。
DB接続は「Entity Framework」を使うパターンと「SqlClient」を使うパターンがあります。
Entity Frameworkで接続
Entity Frameworkを使用するには参照設定を追加したり、コンフィグファイルに書き込んだりといった設定が必要ですが、「ADO.NET Entity Data Model」を追加することで必要な設定が行われます。
「ADO.NET Entity Data Model」には、UIベースで構築する「EF Designer」とコードベースで構築する「Code First」があります。
「ADO.NET Entity Data Model」を追加する
データモデルを追加するフォルダを右クリック ⇒ 追加 ⇒ 新しい項目をクリックします。
「ADO.NET Entity Data Model」を選択して「追加」をクリックします。
「EF Designer」を追加する場合
「データベースから EF Designer」を選択して「次へ」をクリックします。
コンフィグファイルにパスワードを含めるかを選択して「次へ」をクリックします。
Entity Frameworkのバージョンを指定して「次へ」をクリックします。
モデルに含めるテーブル(ビュー)を選択して「完了」をクリックします。
「Code First」を追加する場合
「データベースから Code First」を選択して「次へ」をクリックします。
~「EF Designer」を追加する場合と同じ~
SqlClientで接続
サンプルコード
using System;
using System.Data;
using System.Data.SqlClient;
namespace ApplicationLogic
{
public class DacSqlserver : IDisposable
{
private bool _isTran = false;
private SqlConnection _con;
private SqlTransaction _tran;
public DacSqlserver(string strConnectionString)
{
string connectionString = strConnectionString;
try
{
if (_con == null)
{
_con = new SqlConnection(connectionString);
_con.Open();
}
}
catch (Exception ex)
{
throw new DataException("DB接続時にエラーが発生しました", ex);
}
}
/// <summary>
/// トランザクションフラグ
/// </summary>
public bool IsTran
{
get
{
return _isTran;
}
private set
{
_isTran = value;
}
}
/// <summary>
/// トランザクションを開始
/// </summary>
public void BeginTran(IsolationLevel level = IsolationLevel.ReadCommitted)
{
try
{
if (_con == null)
{
_con.Open();
}
if (_con != null && _tran == null)
{
_tran = _con.BeginTransaction(level);
IsTran = true;
}
}
catch (Exception ex)
{
throw new DataException("トランザクション開始時にエラーが発生しました", ex);
}
}
/// <summary>
/// コミット
/// </summary>
public void CommitTran()
{
try
{
if (_tran != null && IsTran)
{
_tran.Commit();
_tran.Dispose();
_tran = null;
IsTran = false;
}
}
catch (Exception ex)
{
throw new DataException("トランザクションコミット時にエラーが発生しました", ex);
}
}
/// <summary>
/// ロールバック
/// </summary>
public void RollbackTran()
{
try
{
if (_tran != null)
{
_tran.Rollback();
_tran.Dispose();
_tran = null;
IsTran = false;
}
}
catch (Exception ex)
{
throw new DataException("トランザクションロールバック時にエラーが発生しました", ex);
}
}
/// <summary>
/// クローズ
/// </summary>
public void Dispose()
{
try
{
RollbackTran();
if (_tran != null)
{
_tran.Dispose();
_tran = null;
}
if (_con != null)
{
_con.Close();
}
}
catch (Exception ex)
{
throw new DataException("DBクローズ中にエラーが発生しました", ex);
}
finally
{
if (_con != null)
{
_con.Dispose();
}
}
}
/// <summary>
/// トランザクションを伴わないSQLを実行
/// </summary>
public DataTable ExecuteNonTranSql(string query, params SqlParameter[] parameterValues)
{
using (var cmd = _con.CreateCommand())
{
try
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = query;
foreach (var item in parameterValues)
cmd.Parameters.Add(item);
var adapter = new SqlDataAdapter(cmd);
var table = new DataTable();
adapter.Fill(table);
cmd.Parameters.Clear();
return table;
}
catch (Exception ex)
{
throw new DataException("SQL実行中にエラーが発生しました", ex);
}
}
}
/// <summary>
/// トランザクションを伴うSQLを実行
/// </summary>
public int ExecuteTranSql(string query, params SqlParameter[] parameterValues)
{
if (_tran == null || !IsTran)
throw new DataException("トランザクションが開始していません");
using (var cmd = _con.CreateCommand())
{
try
{
cmd.Transaction = _tran;
cmd.CommandType = CommandType.Text;
cmd.CommandText = query;
foreach (var item in parameterValues)
cmd.Parameters.Add(item);
var effect = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return effect;
}
catch (Exception ex)
{
throw new DataException("SQL実行中にエラーが発生しました", ex);
}
}
}
}
}