MyBatisNet数据操作类

1

using System;
using System.Collections.Generic;
using System.Collections;
using System.Data;
using System.Linq;
using MT.Framework.DataOperation;
using MT.Framework.DataOperation.Sequences;
using MT.Framework.Logs;
using MyBatis.DataMapper;
using MyBatis.DataMapper.Exceptions;
using MyBatis.DataMapper.Session;
using MyBatis.DataMapper.Session.Transaction;

namespace MT.Frame.DAL.DataAccessLayer
{
    /// <summary>
    /// MyBatisNet数据操作类
    /// </summary>
    public class DatabaseMyBatis : IDatabaseMyBatis, IDisposable
    {

        private string _errorInfo;
        /// <summary>
        /// 错误提示
        /// </summary>
        public string ErrorInfo
        {
            get { return _errorInfo; }
            set { _errorInfo = value; }
        }
        private DatabaseMybatisBuilder _dataBase;
        private IDataMapper _dataMapper;
        /// <summary>
        /// SqlMapper对象
        /// </summary>
        protected IDataMapper DataMapper
        {
            get { return _dataMapper; }
            set
            {
                _dataMapper = value;
                _sessionFactory = ((IModelStoreAccessor)_dataMapper).ModelStore.SessionFactory;
            }
        }
        /// <summary>
        /// Session
        /// </summary>
        private ISession _session;
        /// <summary>
        /// _transaction
        /// </summary>
        private ITransaction _transaction;
        /// <summary>
        /// 
        /// </summary>
        private ISessionFactory _sessionFactory;

        private string _connectionString;
        /// <summary>
        /// 数据库连接字符串
        /// </summary>
        public string ConnectionString
        {
            get { return _connectionString; }
            set { _connectionString = value; }
        }
        /// <summary>
        /// 序号生成器
        /// </summary>
        public ISequences Sequences { get; private set; }

        #region 构造函数
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="connectionString"></param>
        public DatabaseMyBatis(string connectionString)
        {
            ConnectionString = connectionString;
            _dataBase = new DatabaseMybatisBuilder();
            DataMapper = _dataBase.GetMapper();
            //_sessionFactory = _dataBase.SessionFactory;
            _sessionFactory.DataSource.ConnectionString = connectionString;
            Sequences = new Sequence(ConnectionString);
            // SqlMapperForSequence = _dataBase.GetMapper("SqlMapSequence.config");


        }
        /// <summary>
        /// 
        /// </summary>
        public DatabaseMyBatis()
        {
            _dataBase = new DatabaseMybatisBuilder();
            DataMapper = _dataBase.GetMapper();
            //  _sessionFactory = _dataBase.SessionFactory;
            // SqlMapperForSequence = _dataBase.GetMapper("SqlMapSequence.config");

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="connectionString"></param>
        /// <param name="sqlMapFileName"></param>
        public DatabaseMyBatis(string connectionString, string sqlMapFileName)
        {
            // _application = application;
            _dataBase = new DatabaseMybatisBuilder();
            DataMapper = _dataBase.GetMapper2(sqlMapFileName);
            ConnectionString = connectionString;
            // _sessionFactory = _dataBase.SessionFactory;
            _sessionFactory.DataSource.ConnectionString = connectionString;
            //Sequences = new Sequence(ConnectionString);

        }


        //public DatabaseMyBatis( IDataMapper idataMapper)
        //{
        //   // this._application = application;
        //    _dataBase = new DatabaseMybatisBuilder();
        //    _dataMapper = idataMapper;

        //}

        #endregion

        /// <summary>
        /// 连接到数据,并作相应的初始化
        /// </summary>
        /// <returns></returns>
        public Boolean ConnectAccessDb()
        {
            try
            {
                ISession session = _sessionFactory.OpenSession();
                if (session == null)
                {
                    return false;
                }
                session.OpenConnection();
                session.Close();
                return true;
            }
            catch (DataMapperException e)
            {
                ErrorInfo = @"打开数据库出错:
" + e.InnerException.Message;
                return false;
            }
            catch (Exception ex)
            {
                ErrorInfo = string.Format("初始化DataMapper对象出错:
{0}", ex.Message);
                return false;
            }

        }
        /// <summary>
        /// 连接到数据库,并作相应的初始化
        /// </summary>
        /// <returns></returns>
        public Boolean ConnectDb()
        {
            try
            {
                if (_dataBase == null)
                {
                    _dataBase = new DatabaseMybatisBuilder();
                }
                if (DataMapper == null)
                {
                    DataMapper = _dataBase.GetMapper();
                }
                //if (SqlMapperForSequence == null)
                //{
                //    SqlMapperForSequence = _dataBase.GetMapper("SqlMapSequence.config");
                //}
                //  _seq = new SeqNumber(SqlMapperForSequence);

                using (ISession session = _sessionFactory.OpenSession())
                {
                    if (session == null)
                    {
                        return false;
                    }
                    using (var con = session.OpenConnection())
                    {
                        con.Close();
                        con.Dispose();
                    }

                    session.Close();
                    session.Dispose();
                }
                return true;
            }
            catch (DataMapperException e)
            {
                ErrorInfo = string.Format("打开数据库出错:
{0}", e.InnerException.Message);
                return false;
            }
            catch (Exception ex)
            {
                ErrorInfo = @"初始化DataMapper对象出错:
" + ex.Message;
                return false;
            }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IDataMapper GetMapper()
        {
            return _dataMapper;
        }

        #region 数据操作方法
        #region 事物控制方法
        /// <summary>
        /// 开始一个会话
        /// </summary>
        private void BeginSession()
        {
            if (_session != null)
            {
                CloseSession();
            }
            _session = _sessionFactory.OpenSession();
        }
        /// <summary>
        /// 关闭一个会话
        /// </summary>
        private void CloseSession()
        {
            if (_session != null)
            {
                if (_session.Connection != null)
                {
                    _session.Connection.Close();
                    _session.Connection.Dispose();
                }
                _session.Close();
                _session.Dispose();
                _session = null;
            }
        }
        /// <summary>
        /// 开启一个事物
        /// </summary>
        public void BeginTransaction()
        {
            IsAutoCommit = false;
            BeginSession();
            _transaction = _session.BeginTransaction();

        }
        /// <summary>
        /// 提交一个事物
        /// </summary>
        public void CommitTransaction()
        {
            _transaction.Commit();
            CloseSession();
            IsAutoCommit = true;

        }
        /// <summary>
        /// 回滚一个事件
        /// </summary>
        public void RollBackTransaction()
        {
            _transaction.Rollback();
            CloseSession();
            IsAutoCommit = true;

        }
        #endregion
        #endregion
        /// <summary>
        /// 
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        public IList QueryForIList(string statementName, object parameterObject)
        {
            using (var session = _sessionFactory.OpenSession())
            {
                using (var con = session.OpenConnection())
                {
                    try
                    {
                        var list = _dataMapper.QueryForList(statementName, parameterObject);
                        con.Close();
                        con.Dispose();
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                        return list;
                    }
                    catch (Exception ex)
                    {
                        session.Close();
                        session.Dispose();
                        ErrorInfo = ex.Message;
                        throw new Exception(ex.Message, ex);
                    }
                    finally
                    {
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                    }
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        public IList<T> QueryForList<T>(string statementName, object parameterObject)
        {
            using (var session = _sessionFactory.OpenSession())
            {
                using (var con = session.OpenConnection())
                {
                    try
                    {
                        var list = _dataMapper.QueryForList<T>(statementName, parameterObject);
                        con.Close();
                        con.Dispose();
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                        return list;

                    }
                    catch (Exception ex)
                    {
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                        ErrorInfo = ex.Message;
                        throw new Exception(ex.Message, ex);
                    }
                    finally
                    {
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                    }
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        public IList QueryForList(string statementName, object parameterObject)
        {
            using (var session = _sessionFactory.OpenSession())
            {
                using (var con = session.OpenConnection())
                {
                    try
                    {
                        var list = _dataMapper.QueryForList(statementName, parameterObject);
                        con.Close();
                        con.Dispose();
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                        return list;

                    }
                    catch (Exception ex)
                    {
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                        ErrorInfo = ex.Message;
                        throw new Exception(ex.Message, ex);
                    }
                    finally
                    {
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                    }
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        public object QueryForObject(string statementName, object parameterObject)
        {
            using (var session = _sessionFactory.OpenSession())
            {
                using (var con = session.OpenConnection())
                {
                    try
                    {
                        var obj = _dataMapper.QueryForObject(statementName, parameterObject);
                        con.Close();
                        con.Dispose();
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                        return obj;
                    }
                    catch (Exception ex)
                    {
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                        ErrorInfo = ex.Message;
                        throw new Exception(ex.Message, ex);
                    }
                    finally
                    {
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                    }
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        public T QueryForObject<T>(string statementName, object parameterObject)
        {
            using (var session = _sessionFactory.OpenSession())
            {
                using (var con = session.OpenConnection())
                {
                    try
                    {
                        var obj = _dataMapper.QueryForObject<T>(statementName, parameterObject);
                        con.Close();
                        con.Dispose();
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                        return obj;
                    }
                    catch (Exception ex)
                    {
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                        ErrorInfo = ex.Message;
                        throw new Exception(ex.Message, ex);
                    }
                    finally
                    {
                        if (session.Connection != null)
                        {
                            session.Connection.Close();
                            session.Connection.Dispose();
                        }
                        session.Close();
                        session.Dispose();
                    }
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        public Boolean QueryForDataTable(out DataTable dt, string statementName, object parameterObject)
        {
            try
            {
                dt = new DataTable();
                IList list = QueryForList(statementName, parameterObject);
                // object iDictionary = sqlMapper.QueryForObject(statementName, parameterObject);
                if (list.Count <= 0)
                {

                    return false;
                }
                //此处遍历IList的结构并建立同样的DataTable
                System.Reflection.PropertyInfo[] p = list[0].GetType().GetProperties();
                // var a = list[0] as ArrayList;
                foreach (System.Reflection.PropertyInfo pi in p)
                {
                    Type colType = pi.PropertyType;

                    if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                    {

                        colType = colType.GetGenericArguments()[0];

                    }
                    // ReSharper disable once AssignNullToNotNullAttribute
                    dt.Columns.Add(pi.Name, Type.GetType(colType.ToString()));
                }

                for (int i = 0; i < list.Count; i++)
                {
                    // t1 = list[i];
                    IList tempList = new ArrayList();
                    //将IList中的一条记录写入ArrayList
                    foreach (var pi in p)
                    {
                        object oo = pi.GetValue(list[i], null);
                        tempList.Add(oo);
                    }

                    object[] itm = new object[p.Length];
                    //遍历ArrayList向object[]里放数据
                    for (int j = 0; j < tempList.Count; j++)
                    {
                        itm.SetValue(tempList[j], j);
                    }
                    //将object[]的内容放入DataTable
                    dt.LoadDataRow(itm, true);
                }
            }
            catch (Exception ex)
            {
                ErrorInfo = ex.Message;
                throw new Exception(ex.Message, ex);
            }
            return true;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt"></param>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <returns></returns>
        public Boolean QueryForDataTable<T>(out DataTable dt, string statementName, object parameterObject)
        {
            dt = new DataTable();
            try
            {
                // dt = new DataTable();
                IList<T> list = QueryForList<T>(statementName, parameterObject);
                T t1;
                if (list.Count <= 0)
                {
                    //dt = getDataTableForClass(typeof(T).ToString());
                    dt = GetDataTableForClass<T>();
                    return true;
                }
                //此处遍历IList的结构并建立同样的DataTable
                System.Reflection.PropertyInfo[] p = list[0].GetType().GetProperties();
                foreach (System.Reflection.PropertyInfo pi in p)
                {
                    Type type = typeof(T);
                    if (pi.DeclaringType != type)
                    {
                        continue;
                    }
                    Type colType = pi.PropertyType;
                    if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                    {

                        colType = colType.GetGenericArguments()[0];

                    }
                    // ReSharper disable once AssignNullToNotNullAttribute
                    dt.Columns.Add(pi.Name, Type.GetType(colType.ToString()));
                }

                for (int i = 0; i < list.Count; i++)
                {

                    t1 = list[i];
                    IList tempList = new ArrayList();
                    //int len = 0;
                    //将IList中的一条记录写入ArrayList
                    foreach (var pi in t1.GetType().GetProperties())
                    {
                        Type type1 = typeof(T);
                        if (pi.DeclaringType != type1)
                        {
                            continue;
                        }
                        object oo = pi.GetValue(t1, null);
                        tempList.Add(oo);

                    }

                    object[] itm = new object[tempList.Count];
                    //遍历ArrayList向object[]里放数据
                    for (int j = 0; j < tempList.Count; j++)
                    {
                        itm.SetValue(tempList[j], j);
                    }
                    //将object[]的内容放入DataTable
                    dt.LoadDataRow(itm, true);
                }
            }
            catch (Exception ex)
            {
                ErrorInfo = ex.Message;
                dt = GetDataTableForClass<T>();
                //System.Windows.Forms.MessageBox.Show("数据查询出错:" + ex.Message, "查询错误", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
                throw new Exception(ex.Message, ex);
                //return false;
            }
            return true;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public DataTable GetDataTableForClass<T>()
        {
            var dt = new DataTable();
            try
            {
                Type type = typeof(T);
                DataColumn dcl;

                foreach (var item in type.GetProperties())
                {

                    Type type1 = typeof(T);
                    if (item.DeclaringType != type1)
                    {
                        continue;
                    }
                    Type colType = item.PropertyType;
                    if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                    {

                        colType = colType.GetGenericArguments()[0];

                    }

                    dcl = new DataColumn(item.Name, colType);
                    dt.Columns.Add(dcl);

                }
                dt.TableName = type.Name;
            }
            catch (Exception ex)
            {
                ErrorInfo = ex.Message;
                throw new Exception(ex.Message, ex);
            }
            return dt;

        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="parameterClass"></param>
        /// <returns></returns>
        public DataTable GetDataTableForClass(string parameterClass)
        {
            var dt = new DataTable();
            try
            {
                Type type = Type.GetType(parameterClass);
                if (type == null)
                {

                    throw new Exception("传入的类型【" + parameterClass + "】不存在!");
                }
                DataColumn dcl;

                foreach (var item in type.GetProperties())
                {
                    Type colType = item.PropertyType;
                    if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                    {

                        colType = colType.GetGenericArguments()[0];

                    }
                    dcl = new DataColumn(item.Name, colType);
                    dt.Columns.Add(dcl);

                }
                dt.TableName = type.Name;
            }
            catch (Exception ex)
            {
                ErrorInfo = ex.Message;
                throw new Exception(ex.Message, ex);
            }
            return dt;

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <param name="keyValue"></param>
        /// <param name="returnValue"></param>
        /// <returns></returns>
        public bool Insert<T>(string statementName, T parameterObject, ref Nullable<Int32> keyValue,
            out object returnValue)
        {
            object a;
            if (IsAutoCommit)
            {
                using (ISession session = _sessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        try
                        {
                            a = _dataMapper.Insert(statementName, parameterObject);
                            keyValue = Convert.ToInt32(a);
                            returnValue = a;
                            transaction.Commit();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                        catch (Exception ex)
                        {
                            ErrorInfo = ex.Message;
                            transaction.Rollback();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            returnValue = null;
                            return false;
                        }
                        finally
                        {
                            transaction.Complete();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                    }
                }
            }

            else
            {
                try
                {
                    a = _dataMapper.Insert(statementName, parameterObject);
                    keyValue = Convert.ToInt32(a);
                    returnValue = a;
                    return true;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message, ex);
                }

            }
            return true;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <param name="returnValue"></param>
        /// <returns></returns>
        public bool Insert<T>(string statementName, T parameterObject, out object returnValue)
        {
            if (IsAutoCommit)
            {
                using (ISession session = _sessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        try
                        {
                            returnValue = _dataMapper.Insert(statementName, parameterObject);
                            transaction.Commit();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                        catch (Exception ex)
                        {
                            ErrorInfo = ex.Message;
                            transaction.Rollback();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            returnValue = null;
                            return false;
                        }
                        finally
                        {
                            transaction.Complete();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                    }
                }
            }
            else
            {
                returnValue = _dataMapper.Insert(statementName, parameterObject);
            }
            return true;

        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="parameterObjects"></param>
        /// <returns></returns>
        public bool Insert<T>(string statementName, IEnumerable<T> parameterObjects)
        {

            if (IsAutoCommit)
            {
                using (ISession session = _sessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        try
                        {
                            foreach (object parameterObject in parameterObjects)
                            {
                                _dataMapper.Insert(statementName, parameterObject);
                            }
                            transaction.Commit();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                        catch (Exception ex)
                        {
                            ErrorInfo = ex.Message;
                            transaction.Rollback();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            return false;
                        }
                        finally
                        {
                            transaction.Complete();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                    }
                }
            }
            else
            {
                foreach (object parameterObject in parameterObjects)
                {
                    _dataMapper.Insert(statementName, parameterObject);
                }
            }
            return true;

        }

        /// <summary>
        /// 更新单条数据
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <param name="returnValue"></param>
        /// <returns></returns>
        public bool Update<T>(string statementName, T parameterObject, out object returnValue)
        {
            if (IsAutoCommit)
            {
                using (ISession session = _sessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        try
                        {
                            returnValue = _dataMapper.Update(statementName, parameterObject);
                            transaction.Commit();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                        catch (Exception ex)
                        {
                            ErrorInfo = ex.Message;
                            transaction.Rollback();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            returnValue = null;
                            return false;
                        }
                        finally
                        {
                            transaction.Complete();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                    }
                }
            }
            else
            {
                returnValue = _dataMapper.Update(statementName, parameterObject);

            }
            return true;
        }
        /// <summary>
        /// 更新一组数据
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="parameterObjects"></param>
        /// <returns></returns>
        public bool Update<T>(string statementName, IEnumerable<T> parameterObjects)
        {
            if (IsAutoCommit)
            {
                using (ISession session = _sessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        try
                        {
                            foreach (object parameterObject in parameterObjects)
                            {
                                _dataMapper.Update(statementName, parameterObject);
                            }
                            transaction.Commit();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                        catch (Exception ex)
                        {
                            ErrorInfo = ex.Message;
                            transaction.Rollback();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            return false;
                        }
                        finally
                        {
                            transaction.Complete();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                    }
                }
            }
            else
            {
                foreach (object parameterObject in parameterObjects)
                {
                    _dataMapper.Update(statementName, parameterObject);
                }
            }

            return true;

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="parameterObject"></param>
        /// <param name="returnValue"></param>
        /// <returns></returns>
        public bool Delete<T>(string statementName, T parameterObject, out object returnValue)
        {
            if (IsAutoCommit)
            {
                using (ISession session = _sessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        try
                        {
                            returnValue = _dataMapper.Delete(statementName, parameterObject);
                            transaction.Commit();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                        catch (Exception ex)
                        {
                            ErrorInfo = ex.Message;
                            transaction.Rollback();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            returnValue = null;
                            return false;
                        }
                        finally
                        {
                            transaction.Complete();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                    }
                }
            }
            else
            {
                returnValue = _dataMapper.Delete(statementName, parameterObject);
            }
            return true;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="parameterObjects"></param>
        /// <returns></returns>
        public bool Delete<T>(string statementName, IEnumerable<T> parameterObjects)
        {
            if (IsAutoCommit)
            {
                using (ISession session = _sessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        try
                        {
                            foreach (object parameterObject in parameterObjects)
                            {
                                _dataMapper.Delete(statementName, parameterObject);
                            }
                            transaction.Commit();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            //return true;
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            ErrorInfo = ex.Message;
                            transaction.Rollback();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            return false;
                        }
                        finally
                        {
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                        }
                    }

                }
                //  CommitTransaction();
            }
            else
            {
                foreach (object parameterObject in parameterObjects)
                {
                    _dataMapper.Delete(statementName, parameterObject);
                }
            }
            return true;
        }

        #region 实现对IList到DataSet的转换
        ///<summary>
        /// 实现对IList到DataSet的转换
        /// </summary>
        /// <param name="resList">待转换的IList</param>
        /// <returns>转换后的DataSet</returns>
        public DataSet ListToDataSet(IList resList)
        {
            var rds = new DataSet();
            //将DateTable放入DataSet
            rds.Tables.Add(ListToDataTable(resList));
            //返回DataSet
            return rds;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="resList"></param>
        /// <returns></returns>
        public DataTable ListToDataTable(IList resList)
        {
            var tempDt = new DataTable();

            //此处遍历IList的结构并建立同样的DataTable
            System.Reflection.PropertyInfo[] p = resList[0].GetType().GetProperties();
            foreach (System.Reflection.PropertyInfo pi in p)
            {
                Type colType = pi.PropertyType;
                if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                {
                    colType = colType.GetGenericArguments()[0];
                }
                // ReSharper disable once AssignNullToNotNullAttribute
                tempDt.Columns.Add(pi.Name, Type.GetType(colType.ToString()));
            }

            for (int i = 0; i < resList.Count; i++)
            {
                IList tempList = new ArrayList();
                //将IList中的一条记录写入ArrayList
                foreach (System.Reflection.PropertyInfo pi in p)
                {
                    object oo = pi.GetValue(resList[i], null);
                    tempList.Add(oo);
                }

                object[] itm = new object[p.Length];
                //遍历ArrayList向object[]里放数据
                for (int j = 0; j < tempList.Count; j++)
                {
                    itm.SetValue(tempList[j], j);
                }
                //将object[]的内容放入DataTable
                tempDt.LoadDataRow(itm, true);
            }

            return tempDt;
        }
        #endregion

        private Boolean _autoCommit = true;
        /// <summary>
        /// 是否自动事物处理
        /// </summary>
        public bool IsAutoCommit
        {
            get
            {
                return _autoCommit;
            }
            set
            {
                _autoCommit = value;
            }
        }
        /// <summary>
        ///批量执行一组操作
        /// </summary>
        /// <param name="listParameter"></param>
        /// <returns></returns>
        public int ExecutionBatch(List<MyBatisNetParameter> listParameter)
        {
            if (listParameter == null || listParameter.Count == 0)
            {
                return 1;
            }
            try
            {
                listParameter.Sort(delegate(MyBatisNetParameter a, MyBatisNetParameter b)
                {
                    return a.ExecSort.CompareTo(b.ExecSort);
                }
                );

                IsAutoCommit = false;
                bool succeed = true;
                using (ISession session = _sessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        try
                        {
                            foreach (var item in listParameter)
                            {
                                if (item.ParemeterObject == null)
                                {
                                    continue;
                                }
                                if (item.StatementName == null || item.StatementName.Trim().Length <= 0)
                                {
                                    continue;
                                }
                                switch (item.ExecDbtype)
                                {
                                    case EnumExecDbType.Insert:
                                        succeed = item.ParemeterObject == null
                                            ? Insert(item.StatementName, item.ParemeterObject)
                                            : Insert(item.StatementName, item.ParemeterObject.ToArray());
                                        break;
                                    case EnumExecDbType.Update:
                                        succeed = item.ParemeterObject == null
                                            ? Update(item.StatementName, item.ParemeterObject)
                                            : Update(item.StatementName, item.ParemeterObject.ToArray());
                                        break;
                                    case EnumExecDbType.Delete:
                                        succeed = item.ParemeterObject == null
                                            ? Delete(item.StatementName, item.ParemeterObject)
                                            : Delete(item.StatementName, item.ParemeterObject.ToArray());

                                        break;
                                }
                                if (!succeed)
                                {
                                    transaction.Rollback();
                                    transaction.Dispose();
                                    if (session.Connection != null)
                                    {
                                        session.Connection.Close();
                                        session.Connection.Dispose();
                                    }
                                    session.Close();
                                    session.Dispose();
                                    return -1;
                                }
                            }
                            transaction.Commit();
                            transaction.Dispose();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            IsAutoCommit = true;
                            // return 1;
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            ErrorInfo = ex.Message;
                            transaction.Dispose();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            return -1;
                        }
                        finally
                        {
                            transaction.Complete();
                            transaction.Dispose();
                            if (session.Connection != null)
                            {
                                session.Connection.Close();
                                session.Connection.Dispose();
                            }
                            session.Close();
                            session.Dispose();
                            IsAutoCommit = true;
                        }
                    }

                }
                IsAutoCommit = true;
                return 1;

            }
            catch (Exception ex)
            {
                ErrorInfo = ex.Message;
                IsAutoCommit = true;
                if (ex.InnerException != null)
                {
                    throw new Exception(ex.Message, ex.InnerException);
                }
                return -1;
            }
            finally
            {
                IsAutoCommit = true;
            }
        }
        #region 取出错信息
        /// <summary>
        /// 取出错信息
        /// </summary>
        /// <returns></returns>
        public string GetErrText()
        {
            return ErrorInfo;
        }
        #endregion

        /// <summary>
        ///深层复制一个实例
        /// </summary>
        /// <returns></returns>
        public object Clone()
        {
            return new DatabaseMyBatis
            {
                DataMapper = DataMapper,
                ConnectionString = ConnectionString,
                ErrorInfo = ErrorInfo,
                IsAutoCommit = IsAutoCommit,
                Sequences = Sequences,
                //  SqlMapperForSequence = SqlMapperForSequence
            };
        }
        private bool _isDisposed;
        /// <summary>
        /// 
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="disposing"></param>
        protected virtual void Dispose(bool disposing)
        {
            if (!_isDisposed)
            {
                if (disposing)
                {
                    if (_session != null)
                    {
                        if (_session.Connection != null)
                        {
                            _session.Connection.Close();
                            _session.Connection.Dispose();
                        }
                        _session.Dispose();
                        _session = null;
                    }
                    //if (_sessionFactory != null)
                    //{
                    //    _sessionFactory.Dispose();
                    //    _sessionFactory = null;
                    //}
                    if (_transaction != null)
                    {
                        _transaction.Dispose();
                        _transaction = null;
                    }

                    //通过调用托管对象的Dispose()方法释放托管对象
                }
                CloseSession();
                //释放未托管对象的代码
                //比如关闭数据库的连接,关闭文件句柄等
            }
            _isDisposed = true;
        }
        /// <summary>
        /// 
        /// </summary>
        ~DatabaseMyBatis()
        {
            Dispose(false);
        }

    }


}

providers.config

<?xml version="1.0" encoding="utf-8"?>
<providers xmlns="http://ibatis.apache.org/providers"	
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <clear/>
  <provider
		  name="sqlServer1.0"
		  description="Microsoft SQL Server, provider V1.0.3300.0 in framework .NET V1.0"
		  enabled="false"
		  assemblyName="System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.SqlClient.SqlConnection"
		  commandClass="System.Data.SqlClient.SqlCommand"
		  parameterClass="System.Data.SqlClient.SqlParameter"
		  parameterDbTypeClass="System.Data.SqlDbType"
		  parameterDbTypeProperty="SqlDbType"
		  dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
		  commandBuilderClass="System.Data.SqlClient.SqlCommandBuilder"
		  usePositionalParameters="false"
		  useParameterPrefixInSql="true"
		  useParameterPrefixInParameter="true"
		  parameterPrefix="@"
		  allowMARS="false"
  />
  <provider
		  name="sqlServer1.1"
		  description="Microsoft SQL Server, provider V1.0.5000.0 in framework .NET V1.1"
		  enabled="false"
		  default="true"
		  assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
		  connectionClass="System.Data.SqlClient.SqlConnection"
		  commandClass="System.Data.SqlClient.SqlCommand"
		  parameterClass="System.Data.SqlClient.SqlParameter"
		  parameterDbTypeClass="System.Data.SqlDbType"
		  parameterDbTypeProperty="SqlDbType"
		  dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
		  commandBuilderClass="System.Data.SqlClient.SqlCommandBuilder"
		  usePositionalParameters="false"
		  useParameterPrefixInSql="true"
		  useParameterPrefixInParameter="true"
		  parameterPrefix="@"
		  allowMARS="false"
  />
  <!--SqlServer 2.0 SQl-->
  <provider
		name="sqlServer2.0"
		enabled="false"
		description="Microsoft SQL Server, provider V2.0.0.0 in framework .NET V2.0"
		assemblyName="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
		connectionClass="System.Data.SqlClient.SqlConnection"
		commandClass="System.Data.SqlClient.SqlCommand"
		parameterClass="System.Data.SqlClient.SqlParameter"
		parameterDbTypeClass="System.Data.SqlDbType"
		parameterDbTypeProperty="SqlDbType"
		dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
		commandBuilderClass=" System.Data.SqlClient.SqlCommandBuilder"
		usePositionalParameters = "false"
		useParameterPrefixInSql = "true"
		useParameterPrefixInParameter = "true"
		parameterPrefix="@"
		allowMARS="false"
    />
  <provider
       name="sqlServer4.0"
       enabled="true"
       default="true"
       description="Microsoft SQL Server, provider V4.0.0.0 in framework .NET V4.0"
       assemblyName="System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
       connectionClass="System.Data.SqlClient.SqlConnection"
       commandClass="System.Data.SqlClient.SqlCommand"
       parameterClass="System.Data.SqlClient.SqlParameter"
       parameterDbTypeClass="System.Data.SqlDbType"
       parameterDbTypeProperty="SqlDbType"
       dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
       commandBuilderClass=" System.Data.SqlClient.SqlCommandBuilder"
       usePositionalParameters = "false"
       useParameterPrefixInSql = "true"
       useParameterPrefixInParameter = "true"
       parameterPrefix="@"
       allowMARS="true"
    />
  <provider name="OleDb1.1"
		  description="OleDb, provider V1.0.5000.0 in framework .NET V1.1"
		  enabled="false"
		  assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
		connectionClass="System.Data.OleDb.OleDbConnection"
		  commandClass="System.Data.OleDb.OleDbCommand"
		  parameterClass="System.Data.OleDb.OleDbParameter"
		  parameterDbTypeClass="System.Data.OleDb.OleDbType"
		  parameterDbTypeProperty="OleDbType"
		  dataAdapterClass="System.Data.OleDb.OleDbDataAdapter"
		  commandBuilderClass="System.Data.OleDb.OleDbCommandBuilder"
		  usePositionalParameters="true"
		  useParameterPrefixInSql="false"
		  useParameterPrefixInParameter="false"
		  parameterPrefix=""
		allowMARS="false"
    />
  <provider name="OleDb2.0"
	  description="OleDb, provider V2.0.0.0 in framework .NET V2"
	  enabled="true"
	  assemblyName="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
	  connectionClass="System.Data.OleDb.OleDbConnection"
	  commandClass="System.Data.OleDb.OleDbCommand"
	  parameterClass="System.Data.OleDb.OleDbParameter"
	  parameterDbTypeClass="System.Data.OleDb.OleDbType"
	  parameterDbTypeProperty="OleDbType"
	  dataAdapterClass="System.Data.OleDb.OleDbDataAdapter"
	  commandBuilderClass="System.Data.OleDb.OleDbCommandBuilder"
	  usePositionalParameters="true"
	  useParameterPrefixInSql="false"
	  useParameterPrefixInParameter="false"
	  parameterPrefix=""
	  allowMARS="false"
    />
  <provider
	  name="Odbc1.1"
	  description="Odbc, provider V1.0.5000.0 in framework .NET V1.1"
	  enabled="false"
	  assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
	  connectionClass="System.Data.Odbc.OdbcConnection"
	  commandClass="System.Data.Odbc.OdbcCommand"
	  parameterClass="System.Data.Odbc.OdbcParameter"
	  parameterDbTypeClass="System.Data.Odbc.OdbcType"
	  parameterDbTypeProperty="OdbcType"
	  dataAdapterClass="System.Data.Odbc.OdbcDataAdapter"
	  commandBuilderClass="System.Data.Odbc.OdbcCommandBuilder"
	  usePositionalParameters="true"
	  useParameterPrefixInSql="false"
	  useParameterPrefixInParameter="false"
	  parameterPrefix="@"
	  allowMARS="false"
    />
  <!--ODBC 2.0 Support-->
  <provider
	  name="Odbc2.0"
	  description="Odbc, provider V2.0.0.0 in framework .NET V2"
	  enabled="false"
	  assemblyName="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
	  connectionClass="System.Data.Odbc.OdbcConnection"
	  commandClass="System.Data.Odbc.OdbcCommand"
	  parameterClass="System.Data.Odbc.OdbcParameter"
	  parameterDbTypeClass="System.Data.Odbc.OdbcType"
	  parameterDbTypeProperty="OdbcType"
	  dataAdapterClass="System.Data.Odbc.OdbcDataAdapter"
	  commandBuilderClass="System.Data.Odbc.OdbcCommandBuilder"
	  usePositionalParameters="true"
	  useParameterPrefixInSql="false"
	  useParameterPrefixInParameter="false"
	  parameterPrefix="@"
	  allowMARS="false"
  />

  <provider
	  name="oracle9.2"
	  description="Oracle, Oracle provider V9.2.0.401"
	  enabled="false"
	  assemblyName="Oracle.DataAccess, Version=9.2.0.401, Culture=neutral, PublicKeyToken=89b483f429c47342" connectionClass="Oracle.DataAccess.Client.OracleConnection"
	  commandClass="Oracle.DataAccess.Client.OracleCommand"
	  parameterClass="Oracle.DataAccess.Client.OracleParameter"
	  parameterDbTypeClass="Oracle.DataAccess.Client.OracleDbType"
	  parameterDbTypeProperty="OracleDbType"
	  dataAdapterClass="Oracle.DataAccess.Client.OracleDataAdapter"
	  commandBuilderClass="Oracle.DataAccess.Client.OracleCommandBuilder"
	  usePositionalParameters="false"
	  useParameterPrefixInSql="true"
	  useParameterPrefixInParameter="false"
	  parameterPrefix=":"
	  useDeriveParameters="false"
	  allowMARS="false"
  />
  <provider
	  name="oracle10.1"
	  description="Oracle, oracle provider V10.1.0.301"
	  enabled="false"
	  assemblyName="Oracle.DataAccess, Version=10.1.0.301, Culture=neutral, PublicKeyToken=89b483f429c47342" connectionClass="Oracle.DataAccess.Client.OracleConnection"
	  commandClass="Oracle.DataAccess.Client.OracleCommand"
	  parameterClass="Oracle.DataAccess.Client.OracleParameter"
	  parameterDbTypeClass="Oracle.DataAccess.Client.OracleDbType"
	  parameterDbTypeProperty="OracleDbType"
	  dataAdapterClass="Oracle.DataAccess.Client.OracleDataAdapter"
	  commandBuilderClass="Oracle.DataAccess.Client.OracleCommandBuilder"
	  usePositionalParameters="true"
	  useParameterPrefixInSql="true"
	  useParameterPrefixInParameter="true"
	  parameterPrefix=":"
	  useDeriveParameters="false"
	  allowMARS="false"
  />
 
  <!--Oracle Support-->
  <provider
	  name="oracleClient1.0"
	  description="Oracle, Microsoft provider V1.0.5000.0"
	  enabled="false"
	  assemblyName="System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.OracleClient.OracleConnection"
	  commandClass="System.Data.OracleClient.OracleCommand"
	  parameterClass="System.Data.OracleClient.OracleParameter"
	  parameterDbTypeClass="System.Data.OracleClient.OracleType"
	  parameterDbTypeProperty="OracleType"
	  dataAdapterClass="System.Data.OracleClient.OracleDataAdapter"
	  commandBuilderClass="System.Data.OracleClient.OracleCommandBuilder"
	  usePositionalParameters="false"
	  useParameterPrefixInSql="true"
	  useParameterPrefixInParameter="false"
	  parameterPrefix=":"
	  allowMARS="false"
  />
  <!--ByteFX Support-->
  <provider
	  name="ByteFx"
	  description="MySQL, ByteFx provider V0.7.6.15073"
	  enabled="false"
	  assemblyName="ByteFX.MySqlClient, Version=0.7.6.15073, Culture=neutral, PublicKeyToken=f2fef6fed1732fc1" connectionClass="ByteFX.Data.MySqlClient.MySqlConnection"
	  commandClass="ByteFX.Data.MySqlClient.MySqlCommand"
	  parameterClass="ByteFX.Data.MySqlClient.MySqlParameter"
	  parameterDbTypeClass="ByteFX.Data.MySqlClient.MySqlDbType"
	  parameterDbTypeProperty="MySqlDbType"
	  dataAdapterClass="ByteFX.Data.MySqlClient.MySqlDataAdapter"
	  commandBuilderClass="ByteFX.Data.MySqlClient.MySqlCommandBuilder"
	  usePositionalParameters="false"
	  useParameterPrefixInSql="true"
	  useParameterPrefixInParameter="true"
	  parameterPrefix="@"
	  allowMARS="false"
  />
  <!--MySql Support-->
  <provider
	  name="MySql"
	  description="MySQL, MySQL provider 1.0.7.30072"
	  enabled="false"
	  assemblyName="MySql.Data, Version=1.0.7.30072, Culture=neutral, PublicKeyToken=c5687fc88969c44d" 
    connectionClass="MySql.Data.MySqlClient.MySqlConnection"
	  commandClass="MySql.Data.MySqlClient.MySqlCommand"
	  parameterClass="MySql.Data.MySqlClient.MySqlParameter"
	  parameterDbTypeClass="MySql.Data.MySqlClient.MySqlDbType"
	  parameterDbTypeProperty="MySqlDbType"
	  dataAdapterClass="MySql.Data.MySqlClient.MySqlDataAdapter"
	  commandBuilderClass="MySql.Data.MySqlClient.MySqlCommandBuilder"
	  usePositionalParameters="false"
	  useParameterPrefixInSql="true"
	  useParameterPrefixInParameter="true"
	  parameterPrefix="?"
	  allowMARS="false"
  />
  <!--SQLite 3 Support-->
  <provider name="SQLite3"
	  description="SQLite, SQLite.NET provider V1.0.66.0"
	  enabled="false"
	  assemblyName="System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"
	  connectionClass="System.Data.SQLite.SQLiteConnection"  
    commandClass="System.Data.SQLite.SQLiteCommand"  
    parameterClass="System.Data.SQLite.SQLiteParameter"  
    parameterDbTypeClass="System.Data.SQLite.TypeAffinity"  
    parameterDbTypeProperty="DbType"  
    dataAdapterClass="System.Data.SQLite.SQLiteDataAdapter"  
    commandBuilderClass="System.Data.SQLite.SQLiteCommandBuilder"  
    usePositionalParameters="false"  
    useParameterPrefixInSql="true"  
    useParameterPrefixInParameter="true"  
    parameterPrefix="@"  
    setDbParameterPrecision="false"  
    setDbParameterScale="false"  
    allowMARS="false"  
  />
  <!--Firebird Support-->
  <provider
	  name="Firebird1.7"
	  description="Firebird, Firebird SQL .NET provider V1.7.0.33200"
	  enabled="false"
	  assemblyName="FirebirdSql.Data.Firebird, Version=1.7.0.33200, Culture=neutral, PublicKeyToken=fa843d180294369d" connectionClass="FirebirdSql.Data.Firebird.FbConnection"
	  commandClass="FirebirdSql.Data.Firebird.FbCommand"
	  parameterClass="FirebirdSql.Data.Firebird.FbParameter"
	  parameterDbTypeClass="FirebirdSql.Data.Firebird.FbDbType"
	  parameterDbTypeProperty="FbDbType"
	  dataAdapterClass="FirebirdSql.Data.Firebird.FbDataAdapter"
	  commandBuilderClass="FirebirdSql.Data.Firebird.FbCommandBuilder"
	  usePositionalParameters="false"
	  useParameterPrefixInSql="true"
	  useParameterPrefixInParameter="true"
	  parameterPrefix="@"
	  allowMARS="false"
  />
  <!--PostgreSql Support-->
  <provider
	  name="PostgreSql0.99.1.0"
	  description="PostgreSql, Npgsql provider V0.99.1.0"
	  enabled="false"
	  assemblyName="Npgsql, Version=0.99.1.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"
	  connectionClass="Npgsql.NpgsqlConnection"
	  commandClass="Npgsql.NpgsqlCommand"
	  parameterClass="Npgsql.NpgsqlParameter"
	  parameterDbTypeClass="NpgsqlTypes.NpgsqlDbType"
	  parameterDbTypeProperty="NpgsqlDbType"
	  dataAdapterClass="Npgsql.NpgsqlDataAdapter"
	  commandBuilderClass="Npgsql.NpgsqlCommandBuilder"
	  usePositionalParameters="false"
	  useParameterPrefixInSql="true"
	  useParameterPrefixInParameter="true"
	  parameterPrefix=":"
	  allowMARS="true"
  />
  <!--PostgreSql 2.2.4.3-->
  <provider
   name="PostgreSql2.2.4.3"
   description="PostgreSql, Npgsql provider V2.2.4.3  .Net Data Provider for PostgreSQL"
   enabled="false"
   assemblyName="Npgsql, Version=2.2.4.3, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"
   connectionClass="Npgsql.NpgsqlConnection"
   commandClass="Npgsql.NpgsqlCommand"
   parameterClass="Npgsql.NpgsqlParameter"
   parameterDbTypeClass="NpgsqlTypes.NpgsqlDbType"
   parameterDbTypeProperty="NpgsqlDbType"
   dataAdapterClass="Npgsql.NpgsqlDataAdapter"
   commandBuilderClass="Npgsql.NpgsqlCommandBuilder"
   usePositionalParameters="false"
   useParameterPrefixInSql="true"
   useParameterPrefixInParameter="true"
   parameterPrefix=":"
   allowMARS="true"
  />
  <!--DB2 Support-->
  <provider
	  name="iDb2.10"
	  description="IBM DB2 Provider, V 10.0"
	  enabled="false"
	  assemblyName="IBM.Data.DB2.iSeries, Version=10.0.0.0,Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26, Custom=null" connectionClass="IBM.Data.DB2.iSeries.iDB2Connection"
	  commandClass="IBM.Data.DB2.iSeries.iDB2Command"
	  parameterClass="IBM.Data.DB2.iSeries.iDB2Parameter"
	  parameterDbTypeClass="IBM.Data.DB2.iSeries.iDB2DbType"
	  parameterDbTypeProperty="iDB2DbType"
	  dataAdapterClass="IBM.Data.DB2.iSeries.iDB2DataAdapter"
	  commandBuilderClass="IBM.Data.DB2.iSeries.iDB2CommandBuilder"
	  usePositionalParameters="true"
	  useParameterPrefixInSql="false"
	  useParameterPrefixInParameter="false"
	  parameterPrefix=""
	  allowMARS="false"
  />
  <provider
	  name="Informix"
	  description="Informix NET Provider, 2.81.0.0"
	  enabled="false"
	  assemblyName="IBM.Data.Informix, Version=2.81.0.0, Culture=neutral, PublicKeyToken=7c307b91aa13d208"
	  connectionClass="IBM.Data.Informix.IfxConnection"
	  commandClass="IBM.Data.Informix.IfxCommand"
	  parameterClass="IBM.Data.Informix.IfxParameter"
	  parameterDbTypeClass="IBM.Data.Informix.IfxType"
	  parameterDbTypeProperty="IfxType"
	  dataAdapterClass="IBM.Data.Informix.IfxDataAdapter"
	  commandBuilderClass="IBM.Data.Informix.IfxCommandBuilder"
	  usePositionalParameters = "true"
	  useParameterPrefixInSql = "false"
	  useParameterPrefixInParameter = "false"
	  useDeriveParameters="false"
	  allowMARS="false"
	/>
  <provider
    name="ODP.NET Managed"
    description="Oracle, ODP.NET Managed 4.121.1.0"
    enabled="true"
    assemblyName="Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"
    connectionClass="Oracle.ManagedDataAccess.Client.OracleConnection"
    commandClass="Oracle.ManagedDataAccess.Client.OracleCommand"
    parameterClass="Oracle.ManagedDataAccess.Client.OracleParameter"
    parameterDbTypeClass="Oracle.ManagedDataAccess.Client.OracleDbType"
    parameterDbTypeProperty="OracleDbType"
    dataAdapterClass="Oracle.ManagedDataAccess.Client.OracleDataAdapter"
    commandBuilderClass="Oracle.ManagedDataAccess.Client.OracleCommandBuilder"
    usePositionalParameters="true"
    useParameterPrefixInSql="true"
    useParameterPrefixInParameter="true"
    parameterPrefix=":"
    useDeriveParameters="false"
    allowMARS="false"
/>
</providers>

Web.config 

<?xml version="1.0"?>
<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <configSections>
    <sectionGroup name="iBATIS">
      <section name="logging" type="MyBatis.Common.Logging.ConfigurationSectionHandler,MyBatis.Common"/>
    </sectionGroup>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <appSettings>
    <add key="lo4net.Internal.Debug" value="true"/>
    <add key="ConnectionType" value="Oracle"/>
  </appSettings>
  <connectionStrings>
   
    <add name="SQLSERVER" connectionString="Data Source=10.16.30.40;Initial Catalog=HIS_guye;Persist Security Info=True;User ID=sa;Password=mtkj123!;Max Pool Size=100; Min Pool Size=1;"/>
    <add name="Oracle" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.16.30.30)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=mtemr)));Persist Security Info=True;User ID=MTHOSPITALGUYE;Password=mtkj;"/>
  </connectionStrings>
 

  <!--<system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <add name="textWriterTraceListener" type="System.Diagnostics.TextWriterTraceListener"
             initializeData="Logslog4net.txt"/>
      </listeners>
    </trace>
  </system.diagnostics>-->
  <iBATIS>
    <!--inline :log4net 节点在App.Config/Web.Config 文件中配置
        file:使用外置配置文件 (需要configFile参数配合使用,<arg key="configFile" value="外部配置文件")
        file-watch: 与"file"一样,只是多了一个监视外部配置文件的变动功能,如果有变动则重新加载配置。
        external:IBatis将不会尝试配置Log4Net。-->
    <logging>
      <logFactoryAdapter type="MyBatis.Common.Logging.Log4Net.Log4NetLoggerFA, MyBatis.Common.Logging.Log4Net">
        <!--<arg key="configType" value="inline"/>-->
        <arg key="configType" value="inline"/>
        <arg key="configFile" value="log4net.config"/>
        <arg key="showLogName" value="true"/>
        <arg key="showDataTime" value="true"/>
        <arg key="level" value="ALL"/>
        <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:SSS"/>
      </logFactoryAdapter>
    </logging>
  </iBATIS>
  <log4net>
    <!-- 这个日志是系统其他地方写日志时候用到的设置 -->
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--<file value="./LogsLog_" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd'.txt'" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <header value="&#xD;&#xA;" />
        <ConversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline%newline%newline" />
      </layout>-->
      <file value="./Logs"/>
      <param name="AppendToFile" value="true"/>
      <!--日志最大个数,都是最新的-->
      <!--rollingStyle节点为Date时,该节点不起作用-->
      <!--rollingStyle节点为Size时,只能有value个日志-->
      <!--rollingStyle节点为Composite时,每天有value个日志-->
      <!-- 切割最多文件数 -1表示不限制产生日志文件数-->
      <param name="MaxSizeRollBackups" value="100"/>
      <!--防止多线程时不能写Log,官方说线程非安全-->
      <!--实际使用时,本地测试正常,部署后有不能写日志的情况-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <!-- 每个文件的大小限制  -->
      <param name="MaximumFileSize" value="10MB"/>
      <!--可以为:Once|Size|Date|Composite-->
      <!--Composite为Size和Date的组合-->
      <!-- RollingStyle Composite 综合  Size 按大小  Date 按时间 -->
      <param name="RollingStyle" value="Composite"/>
      <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;"/>
      <param name="StaticLogFileName" value="false"/>
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="Header" value="&#xA;----------------------application startup--------------------------&#xA;"/>
        <param name="Footer" value="&#xA; ----------------------application shutdown--------------------------&#xA;"/>
        <param name="ConversionPattern" value="%d [%t] %-5p %c - (%line)  %m%n"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ALL"/>
        <param name="LevelMax" value="OFF"/>
      </filter>
    </appender>
    <root>
      <level value="All"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
    <!-- IBatisLogFile的日志 -->
    <appender name="IBatisLogFile" type="log4net.Appender.RollingFileAppender">
      <file value="./LogsiBatis_"/>
      <appendToFile value="true"/>
      <datePattern value="yyyy-MM-dd'.txt'"/>
      <rollingStyle value="Date"/>
      <staticLogFileName value="false"/>
      <layout type="log4net.Layout.PatternLayout">
        <header value="[Header]&#xA;"/>
        <footer value="[Footer]&#xA;"/>
        <conversionPattern value="%date{dd/MM/yyyy-HH:mm:ss} %m%newline%exception"/>
      </layout>
    </appender>
    <!-- IBatisMapperLogFile的日志 -->
    <appender name="IBatisMapperLogFile" type="log4net.Appender.RollingFileAppender">
      <!--<file value="./LogsiBatisMapper_" />
      <appendToFile value="true" />
      <datePattern value="yyyy-MM-dd'.txt'" />
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />-->
      <file value="./Logs"/>
      <param name="AppendToFile" value="true"/>
      <!--日志最大个数,都是最新的-->
      <!--rollingStyle节点为Date时,该节点不起作用-->
      <!--rollingStyle节点为Size时,只能有value个日志-->
      <!--rollingStyle节点为Composite时,每天有value个日志-->
      <!-- 切割最多文件数 -1表示不限制产生日志文件数-->
      <param name="MaxSizeRollBackups" value="50"/>
      <!--防止多线程时不能写Log,官方说线程非安全-->
      <!--实际使用时,本地测试正常,部署后有不能写日志的情况-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <!-- 每个文件的大小限制  -->
      <param name="MaximumFileSize" value="10MB"/>
      <!--可以为:Once|Size|Date|Composite-->
      <!--Composite为Size和Date的组合-->
      <!-- RollingStyle Composite 综合  Size 按大小  Date 按时间 -->
      <param name="RollingStyle" value="Composite"/>
      <param name="DatePattern" value="&quot;iBatisMapper_&quot;yyyyMMdd&quot;.txt&quot;"/>
      <param name="StaticLogFileName" value="false"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{dd/MM/yyyy-HH:mm:ss} %m%newline%exception"/>
      </layout>
    </appender>
    <!-- IBatisCacheLogFile的日志 -->
    <appender name="IBatisCacheLogFile" type="log4net.Appender.RollingFileAppender">
      <file value="./LogsiBatisChache_"/>
      <appendToFile value="true"/>
      <datePattern value="yyyy-MM-dd'.txt'"/>
      <rollingStyle value="Date"/>
      <staticLogFileName value="false"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{dd/MM/yyyy-HH:mm:ss} %m%newline%exception"/>
      </layout>
    </appender>
    <!-- 注意一定要加additivity="false",因为异常日志是往上传递的,如果不加这个属性,在系统的总日志里面也会有IBatisNet的日志,这样就重复记录了 -->
    <logger name="MyBatis" additivity="false">
      <level value="All"/>
      <!--如果想增加日志输出目的地,增加<appender-ref>节点就是了,注意后面的ref是在config中配置的appender name-->
      <appender-ref ref="IBatisLogFile"/>
    </logger>
    <!-- 注意一定要加additivity="false",因为异常日志是往上传递的,如果不加这个属性,在系统的总日志里面,以及IBatisNet里的日志里,也会有IBatisNet.DataMapper的日志,这样就重复记录了 -->
    <!--<logger name="IBatisNet.DataMapper" >
      <level value="ALL"/>
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>-->
    <!-- Print only messages of level DEBUG or above in the packages -->
    <logger name="MyBatis.DataMapper" additivity="false">
      <level value="DEBUG"/>
      <appender-ref ref="IBatisMapperLogFile"/>
    </logger>
    <!-- Print only messages of level DEBUG or above in the packages -->
    <logger name="MyBatis.DataMapper.Model.Cache.CacheModel" additivity="false">
      <appender-ref ref="IBatisCacheLogFile"/>
      <level value="DEBUG"/>
    </logger>
    <!--<logger name="MyBatis.DataMapper.Model.Statements.PreparedStatementFactory"  additivity="false">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>-->
    <logger name="MyBatis.DataMapper.DefaultMapperFactory">
      <appender-ref ref="IBatisMapperLogFile"/>
      <level value="DEBUG"/>
    </logger>
    <logger name="MyBatis.DataMapper.Proxy.LazyListGenericFactory">
      <appender-ref ref="IBatisMapperLogFile"/>
      <level value="DEBUG"/>
    </logger>
    <logger name="MyBatis.DataMapper.Proxy.LazyLoadProxyFactory">
      <appender-ref ref="IBatisMapperLogFile"/>
      <level value="DEBUG"/>
    </logger>
    <logger name="MyBatis.DataMapper.Session.Transaction.Ado.AdoTransactionFactory">
      <appender-ref ref="IBatisMapperLogFile"/>
      <level value="DEBUG"/>
    </logger>
    <logger name="MyBatis.DataMapper.Session.Stores.SessionStoreFactory">
      <appender-ref ref="IBatisMapperLogFile"/>
      <level value="DEBUG"/>
    </logger>
    <logger name="MyBatis.DataMapper.Session.DefaultSessionFactory">
      <appender-ref ref="IBatisMapperLogFile"/>
      <level value="DEBUG"/>
    </logger>
    <!--<logger name="MyBatis.DataMapper.Model.DefaultModelStore">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>-->
    <logger name="MyBatis.DataMapper.DataMapper">
      <appender-ref ref="IBatisMapperLogFile"/>
      <level value="DEBUG"/>
    </logger>
    <!--<logger name="MyBatis.DataMapper.Data.PreparedCommandFactory">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.DataExchange.DataExchangeFactory">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.Session.Stores.SessionStoreFactory">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>-->
    <!--<logger name="IBatisNet.DataMapper.Configuration.Cache.CacheModel">
      <level value="ALL" />
      <appender-ref ref="IBatisCacheLogFile" />
    </logger>
    <logger name="IBatisNet.DataMapper.Configuration.Statements.PreparedStatementFactory">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>
    <logger name="IBatisNet.DataMapper.LazyLoadList">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>
    <logger name="IBatisNet.DataAccess.DaoSession">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>
    <logger name="IBatisNet.DataMapper.SqlMapSession">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>
    <logger name="IBatisNet.Common.Transaction.TransactionScope">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>
    <logger name="IBatisNet.DataAccess.Configuration.DaoProxy">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>-->
  </log4net>
  <!--
    有关 web.config 更改的说明,请参见 http://go.microsoft.com/fwlink/?LinkId=235367。

    可在 <httpRuntime> 标记上设置以下特性。
      <system.Web>
        <httpRuntime targetFramework="4.5" />
      </system.Web>
  -->
  <system.web>
    <webServices>
      <protocols>
        <add name="HttpSoap"/>
        <add name="HttpPost"/>
        <add name="HttpGet"/>
        <add name="Documentation"/>
      </protocols>
    </webServices>
    <compilation debug="true" targetFramework="4.5"/>
    <httpRuntime maxRequestLength="2097151" maxQueryStringLength="2097151" useFullyQualifiedRedirectUrl="true" executionTimeout="200"/>
    <pages controlRenderingCompatibilityVersion="4.0"/>
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-1.2.15.0" newVersion="1.2.15.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.serviceModel>
    <protocolMapping>
      <remove scheme="http"/>
      <remove scheme="net.tcp"/>
      <add scheme="http" binding="wsHttpBinding" bindingConfiguration="emrwsHttpBinding"/>
      <add scheme="http" binding="basicHttpBinding" bindingConfiguration="emrbasicHttpBinding"/>
      <add scheme="net.tcp" binding="netTcpContextBinding" bindingConfiguration="emrnetcpContextBinding"/>
      <add scheme="https" binding="wsHttpContextBinding" bindingConfiguration="emrWsHttpContextBinding"/>
    </protocolMapping>
    <bindings>
      <wsHttpBinding>
        <binding name="emrwsHttpBinding" closeTimeout="00:01:00" openTimeout="00:20:00" receiveTimeout="00:20:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" allowCookies="true">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <security mode="None">
            <transport clientCredentialType="None"/>
            <message clientCredentialType="Certificate"/>
          </security>
        </binding>
      </wsHttpBinding>
      <basicHttpBinding>
        <binding name="emrbasicHttpBinding" closeTimeout="00:01:00" openTimeout="00:20:00" receiveTimeout="00:20:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Mtom" allowCookies="true">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <security mode="None">
            <transport clientCredentialType="None"/>
            <message clientCredentialType="Certificate"/>
          </security>
        </binding>
      </basicHttpBinding>
      <!--<wsHttpContextBinding>
        <binding name="ExaWsHttpContextBinding" closeTimeout="00:01:00"
          openTimeout="00:20:00" receiveTimeout="00:20:00" sendTimeout="00:10:00"
          maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
          messageEncoding="Mtom" allowCookies="true">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <reliableSession inactivityTimeout="00:20:00" enabled="true" />
          <security mode="None">
            <transport clientCredentialType="None" />
            <message clientCredentialType="Certificate" />
          </security>
        </binding>
      </wsHttpContextBinding>-->
      <netTcpContextBinding>
        <binding name="emrnetcpContextBinding" transactionFlow="true" closeTimeout="00:01:00" openTimeout="00:20:00" receiveTimeout="00:20:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="500" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <reliableSession enabled="true" ordered="true" inactivityTimeout="00:20:00"/>
          <security mode="None">
            <message clientCredentialType="Certificate"/>
          </security>
        </binding>
      </netTcpContextBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="behavior_1" name="MT.Hospital.WebService.EmrService">
        <clear/>
        <endpoint address="mex" binding="mexHttpBinding" name="MexBehavior" contract="IMetadataExchange"/>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="emrwsHttpBinding" name="emrwsHttpBinding" contract="MT.Hospital.WebService.IEmrService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="EmrApi" binding="basicHttpBinding" bindingConfiguration="emrbasicHttpBinding" name="emrbasicHttpBinding" contract="MT.Hospital.WebService.IEmrService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="net.tcp" binding="netTcpContextBinding" bindingConfiguration="emrnetcpContextBinding" name="emrnetcpContextBinding" contract="MT.Hospital.WebService.IEmrService"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8099/EmrApi"/>
            <add baseAddress="net.tcp://localhost:50001"/>
          </baseAddresses>
          <timeouts closeTimeout="00:01:00" openTimeout="00:20:00"/>
        </host>
      </service>
      <service behaviorConfiguration="behavior_1" name="MT.Hospital.WebService.NetTcp.EmrService">
        <clear/>
        <endpoint address="mex" binding="mexHttpBinding" name="MexBehavior" contract="IMetadataExchange"/>
        <endpoint address="net.tcp" binding="netTcpContextBinding" bindingConfiguration="emrnetcpContextBinding" name="emrnetcpContextBinding" contract="MT.Hospital.WebService.NetTcp.IEmrService"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:50001/Service"/>
            <add baseAddress="http://localhost:8099/"/>
          </baseAddresses>
          <timeouts closeTimeout="00:01:00" openTimeout="00:20:00"/>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behavior_1">
          <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" maxConcurrentInstances="500"/>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceTimeouts transactionTimeout="00:20:00"/>
          <dataContractSerializer maxItemsInObjectGraph="65536000"/>
        </behavior>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

log4net.config 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="iBATIS">
      <section name="logging" type="MyBatis.Common.Logging.ConfigurationSectionHandler,MyBatis.Common" />
    </sectionGroup>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
  </appSettings>
  
  <iBATIS>
    <logging>
      <logFactoryAdapter type="MyBatis.Common.Logging.Log4Net.Log4NetLoggerFA, MyBatis.Common.Logging.Log4Net">
        <arg key="configType" value="inline" />
        <arg key="showLogName" value="true" />
        <arg key="showDateTime" value="true" />
        <arg key="level" value="All" />
        <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:SSS" />
      </logFactoryAdapter>
    </logging>
  </iBATIS>
  <!--每个<appender>子节点代表一种记录日志的方式-->
  <log4net>
    <!-- 这个日志是系统其他地方写日志时候用到的设置 -->
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="./Logs" />
      <param name="AppendToFile" value="true" />
      <!--日志最大个数,都是最新的-->
      <!--rollingStyle节点为Date时,该节点不起作用-->
      <!--rollingStyle节点为Size时,只能有value个日志-->
      <!--rollingStyle节点为Composite时,每天有value个日志-->
      <!-- 切割最多文件数 -1表示不限制产生日志文件数-->
      <param name="MaxSizeRollBackups" value="100"/>
      <!--防止多线程时不能写Log,官方说线程非安全-->
      <!--实际使用时,本地测试正常,部署后有不能写日志的情况-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <!-- 每个文件的大小限制  -->
      <param name="MaximumFileSize" value="10MB"/>
      <!--可以为:Once|Size|Date|Composite-->
      <!--Composite为Size和Date的组合-->
      <!-- RollingStyle Composite 综合  Size 按大小  Date 按时间 -->
      <param name="RollingStyle" value="Composite" />
      <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="Header" value="&#xD;&#xA;----------------------application startup--------------------------&#xD;&#xA;" />
        <param name="Footer" value="&#xD;&#xA; ----------------------application shutdown--------------------------&#xD;&#xA;" />
        <param name="ConversionPattern" value="%d [%t] %-5p %c - (%line)  %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ALL" />
        <param name="LevelMax" value="OFF" />
      </filter>
    </appender>
    <root>
      <level value="All" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>

    <!-- IBatisLogFile的日志 -->

    <appender name="IBatisLogFile" type="log4net.Appender.RollingFileAppender">
      <file value="./LogsiBatis_" />
      <appendToFile value="true" />
      <datePattern value="yyyy-MM-dd'.txt'" />
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <header value="[Header]&#13;&#10;" />
        <footer value="[Footer]&#13;&#10;" />
        <conversionPattern value="%date{dd/MM/yyyy-HH:mm:ss} %m%newline%exception" />
      </layout>
    </appender>

    <!-- IBatisMapperLogFile的日志 -->

    <appender name="IBatisMapperLogFile" type="log4net.Appender.RollingFileAppender">
      <file value="./LogsiBatisMapper_" />
      <appendToFile value="true" />
      <datePattern value="yyyy-MM-dd'.txt'" />
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{dd/MM/yyyy-HH:mm:ss} %m%newline%exception" />
      </layout>
    </appender>

    <!-- IBatisCacheLogFile的日志 -->

    <appender name="IBatisCacheLogFile" type="log4net.Appender.RollingFileAppender">
      <file value="./LogsiBatisChache_" />
      <appendToFile value="true" />
      <datePattern value="yyyy-MM-dd'.txt'" />
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date{dd/MM/yyyy-HH:mm:ss} %m%newline%exception" />
      </layout>
    </appender>



    <!-- 注意一定要加additivity="false",因为异常日志是往上传递的,如果不加这个属性,在系统的总日志里面也会有IBatisNet的日志,这样就重复记录了 -->
    <logger name="MyBatis" additivity="false">
      <level value="All"/>

      <!--如果想增加日志输出目的地,增加<appender-ref>节点就是了,注意后面的ref是在config中配置的appender name-->
      <appender-ref ref="IBatisLogFile" />
    </logger>

    <!-- 注意一定要加additivity="false",因为异常日志是往上传递的,如果不加这个属性,在系统的总日志里面,以及IBatisNet里的日志里,也会有IBatisNet.DataMapper的日志,这样就重复记录了 -->

    <!--<logger name="IBatisNet.DataMapper" >
      <level value="ALL"/>
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>-->

    <!-- Print only messages of level DEBUG or above in the packages -->
    <logger name="MyBatis.DataMapper" >
      <level value="DEBUG"/>
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>

    <!-- Print only messages of level DEBUG or above in the packages -->
    <logger name="MyBatis.DataMapper.Model.Cache.CacheModel">
      <appender-ref ref="IBatisCacheLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.Model.Statements.PreparedStatementFactory">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.DefaultMapperFactory">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.Proxy.LazyListGenericFactory">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.Session.Transaction.Ado.AdoTransactionFactory">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.Session.Stores.SessionStoreFactory">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.Session.DefaultSessionFactory">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.Model.DefaultModelStore">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.DataMapper">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <logger name="MyBatis.DataMapper.DataMapper">
      <appender-ref ref="IBatisMapperLogFile" />
      <level value="DEBUG" />
    </logger>
    <!--<logger name="IBatisNet.DataMapper.Configuration.Cache.CacheModel">
      <level value="ALL" />
      <appender-ref ref="IBatisCacheLogFile" />
    </logger>
    <logger name="IBatisNet.DataMapper.Configuration.Statements.PreparedStatementFactory">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>
    <logger name="IBatisNet.DataMapper.LazyLoadList">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>
    <logger name="IBatisNet.DataAccess.DaoSession">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>
    <logger name="IBatisNet.DataMapper.SqlMapSession">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>
    <logger name="IBatisNet.Common.Transaction.TransactionScope">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>
    <logger name="IBatisNet.DataAccess.Configuration.DaoProxy">
      <level value="ALL" />
      <appender-ref ref="IBatisMapperLogFile" />
    </logger>-->
  </log4net>
</configuration>
原文地址:https://www.cnblogs.com/wangyinlon/p/10907100.html