0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Entity Frameworkを追加してみる

Posted at

はじめに

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」を追加する

データモデルを追加するフォルダを右クリック ⇒ 追加 ⇒ 新しい項目をクリックします。
image.png

「ADO.NET Entity Data Model」を選択して「追加」をクリックします。
image.png

「EF Designer」を追加する場合

「データベースから EF Designer」を選択して「次へ」をクリックします。
image.png

「新しい接続」をクリックします。
image.png

接続情報を指定して「OK」をクリックします。
image.png

コンフィグファイルにパスワードを含めるかを選択して「次へ」をクリックします。
image.png

Entity Frameworkのバージョンを指定して「次へ」をクリックします。
image.png

モデルに含めるテーブル(ビュー)を選択して「完了」をクリックします。
image.png

参照設定とデータモデルが追加されます。
image.png

「Code First」を追加する場合

「データベースから Code First」を選択して「次へ」をクリックします。
image.png

~「EF Designer」を追加する場合と同じ~

参照設定とデータモデルが追加されます。
image.png

SqlClientで接続

サンプルコード

DacSqlserver.cs
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);
                }
            }
        }
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?