Click here to Skip to main content
15,886,788 members
Articles / Programming Languages / C#

Building an Agile SQL Data Access Layer

Rate me:
Please Sign up or sign in to vote.
4.80/5 (5 votes)
6 Jan 2009CPOL4 min read 51K   646   58  
An article on building a SQL Server data access layer in C# in a completely separate layer.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using InMemoryDal.Interfaces;
using InMemoryDal.Entities;
using System.Data.SqlClient;
using System.Data;

namespace InMemoryDal.SqlData
{
    /// <summary>
    /// Manages session to persist data to Sql server
    /// </summary>
    public class SqlOrdersSession: InMemoryDal.Interfaces.IOrdersSession
    {
        private SqlConnection _sqlConnection;
        private SqlTransaction _sqlTransaction;

        private IOrderDAL _dbOrders;        
        //private IOrderItemDAL _dbOrderItems;
        //private ICustomerDAL _dbCustomers;
        //private IProductDAL _dbProducts;

        public SqlOrdersSession(string connectionString)
        {
            OpenConnection(connectionString);
        }

        private void OpenConnection(string connectionString)
        {
            _sqlConnection = new SqlConnection(connectionString);
            try
            {
                _sqlConnection.Open();
            }
            catch (Exception ex)
            {
                ApplicationException exp = new ApplicationException("Db connection error.", ex);
                throw exp;
            }
        }


        #region IOrdersSession Members

        public IDbTransaction BeginTransaction()
        {
            IDbTransaction st = _sqlConnection.BeginTransaction();
            _sqlTransaction = st as SqlTransaction;
            return st;
        }

        public InMemoryDal.Interfaces.ICustomerDAL DbCustomers
        {
            get { throw new NotImplementedException(); }
        }

        public void Save(InMemoryDal.Entities.Customer customer)
        {
            throw new NotImplementedException();
        }

        public void Delete(InMemoryDal.Entities.Customer customer)
        {
            throw new NotImplementedException();
        }

        public IOrderDAL DbOrders
        {
            get
            {
                if (_dbOrders == null)
                    _dbOrders = new SqlOrderDAL(_sqlConnection, _sqlTransaction);
                return _dbOrders as IOrderDAL;
            }
            private set { _dbOrders = value; }
        }

        public void Save(Order order)
        {
            (DbOrders as SqlOrderDAL).Save(order);

        }

        public void Delete(Order order)
        {
            (DbOrders as SqlOrderDAL).Delete(order);
        }

        public InMemoryDal.Interfaces.IOrderItemDAL DbOrderItems
        {
            get { throw new NotImplementedException(); }
        }

        public void Save(InMemoryDal.Entities.OrderItem orderItem)
        {
            throw new NotImplementedException();
        }

        public void Delete(InMemoryDal.Entities.OrderItem orderItem)
        {
            throw new NotImplementedException();
        }

        public InMemoryDal.Interfaces.IProductDAL DbProducts
        {
            get { throw new NotImplementedException(); }
        }

        public void Save(InMemoryDal.Entities.Product product)
        {
            throw new NotImplementedException();
        }

        public void Delete(InMemoryDal.Entities.Product product)
        {
            throw new NotImplementedException();
        }

        #endregion

        #region IDisposable Members

        /// <summary>
        /// Clean up transaction if not committed and sql connection
        /// </summary>
        public void Dispose()
        {
            if (_sqlTransaction != null && _sqlTransaction.Connection != null)
            {
                _sqlTransaction.Rollback();
            }
            if (_sqlConnection != null && _sqlConnection.State == ConnectionState.Open)
            {
                _sqlConnection.Close();
            }
        }

        #endregion
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Italy Italy
Software architect. At present working on C# development, with mainly Asp.net Ajax and MVC user inteface. Particularly interested in OOP, test driven, agile development.

Comments and Discussions