zoukankan      html  css  js  c++  java
  • 入门Dapper案例(自定义仿T4生成模板(Models,Repository),WebApi Autofac依赖注入,Log4Net,Cors跨域 ,自定义写入日志)。

    Dapper 入门案例:Demo下载点我(密码:2020)

      Dapper 一款轻量级的ORM和ADO结合的灵活化框架,作为一名用过EF和ADO的开发,使用Dapper也很是简单。

      开发环境:①、VS2015、②、Sql Server 2012;③、win10;(系统影响不大。)

      项目简介:①、Entity(存放实体);②、Repository(存放接口和逻辑类);③、Utility(公用类存放处);④、WebApi(启动项目)

      其中 Entity与Repository由 自定义仿T4工具(暂时没时间放代码下载) 生成,也是些基础的增删改查方法。

    一、WebApi(启动项目):

         

      

      


    二、 Entity(实体库)

      ①、Models:存放数据库表映射的实体类。

      ②、ViewModels:存放数据库视图所映射的实体类;(当前项目并没有使用视图,所以自定义仿T4工具也没有添加生成视图实体类这一功能。)

      ③、CustomModels:存放自定义实体类;(可将新建实体类装载复杂的sql连接查询结果。) 

      

      

      

    using System;
    namespace Entity.Models
    {
         public  class   Test_User
         {
            public int id {get;set;}
    
            public string user_name {get;set;}
    
            public int age {get;set;}
    
            public string sex {get;set;}
    
            public string phone {get;set;}
    
            public string address {get;set;}
    
            public DateTime create_time {get;set;}
    
            public DateTime update_time {get;set;}
    
          }
    } 
    Test_User.cs

     三、Utility(公用库):

      引用:Newtonsoft.Json(字符串转Json)、System.Data(ADO连接、操作数据库)

      ①、Helper :存放DbHelper和其他帮助类。

      ②、Log  :日志配置。

      注:类库创建按照Entity的创建方法。

      

       Helper文件

    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Utility.Helper
    {
        public enum EffentNextType
        {
            /// <summary>
            /// 对其他语句无任何影响 
            /// </summary>
            None,
            /// <summary>
            /// 当前语句必须为"select count(1) from .."格式,如果存在则继续执行,不存在回滚事务
            /// </summary>
            WhenHaveContine,
            /// <summary>
            /// 当前语句必须为"select count(1) from .."格式,如果不存在则继续执行,存在回滚事务
            /// </summary>
            WhenNoHaveContine,
            /// <summary>
            /// 当前语句影响到的行数必须大于0,否则回滚事务
            /// </summary>
            ExcuteEffectRows,
            /// <summary>
            /// 引发事件-当前语句必须为"select count(1) from .."格式,如果不存在则继续执行,存在回滚事务
            /// </summary>
            SolicitationEvent
        }
        public class CommandInfo
        {
            public object ShareObject = null;
            public object OriginalData = null;
            event EventHandler _solicitationEvent;
            public event EventHandler SolicitationEvent
            {
                add
                {
                    _solicitationEvent += value;
                }
                remove
                {
                    _solicitationEvent -= value;
                }
            }
            public void OnSolicitationEvent()
            {
                if (_solicitationEvent != null)
                {
                    _solicitationEvent(this, new EventArgs());
                }
            }
            public string CommandText;
            public System.Data.Common.DbParameter[] Parameters;
            public EffentNextType EffentNextType = EffentNextType.None;
            public CommandInfo()
            {
    
            }
            public CommandInfo(string sqlText, SqlParameter[] para)
            {
                this.CommandText = sqlText;
                this.Parameters = para;
            }
            public CommandInfo(string sqlText, SqlParameter[] para, EffentNextType type)
            {
                this.CommandText = sqlText;
                this.Parameters = para;
                this.EffentNextType = type;
            }
        }
    }
    EffentNextType.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Utility.Helper
    {
        public static class CommonHelper
        {
             //MD5散列
             public static  string GetMD5(string myString)
             {
                 if (!string.IsNullOrWhiteSpace(myString))
                 {
                     MD5 md5 = new MD5CryptoServiceProvider();
                     byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString);
                     byte[] targetData = md5.ComputeHash(fromData);
                     string byte2String = null;
                     for (int i = 0; i < targetData.Length; i++)
                     {
                         byte2String += targetData[i].ToString("x");
                     }
                     return byte2String;
                 }
                 return "";
             }
        }
    }
    CommonHelper.cs
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Utility.Helper
    {
        /// <summary>
        /// 数据访问抽象基础类
        /// Copyright (C) Maticsoft 
        /// </summary>
        public abstract class DbHelperSQL
        {
            //数据库连接字符串(web.config来配置),多数据库可使用DbHelperSQLP来实现.
            public static readonly string connectionString = ConfigurationManager.ConnectionStrings["OzyLive"].ConnectionString;
            public DbHelperSQL()
            {
            }
    
            #region 公用方法
            /// <summary>
            /// 判断是否存在某表的某个字段
            /// </summary>
            /// <param name="tableName">表名称</param>
            /// <param name="columnName">列名称</param>
            /// <returns>是否存在</returns>
            public static bool ColumnExists(string tableName, string columnName)
            {
                string sql = "select count(1) from syscolumns where [id]=object_id('" + tableName + "') and [name]='" + columnName + "'";
                object res = GetSingle(sql);
                if (res == null)
                {
                    return false;
                }
                return Convert.ToInt32(res) > 0;
            }
            //获取排序或主键
            public static int GetMaxID(string fieldName, string tableName)
            {
                int num = 0;
                string strsql = "select max(" + fieldName + ")+1 from " + tableName + " where IsDel=0";
                object obj = GetSingle(strsql);
                if (fieldName == "sort")
                {
                    if (obj == null)
                    {
                        return 0;
                    }
                    else
                    {
                        num = int.Parse(obj.ToString());
                    }
                }
                else
                {
                    if (obj == null)
                    {
                        return 1;
                    }
                    else
                    {
                        num = int.Parse(obj.ToString());
                    }
                }
                return num;
            }
    
    
    
            public static int GetMaxTypeSort(string fieldName, string tableName, string strWhere)
            {
                int num = 0;
                string strsql = "select max(" + fieldName + ")+1 from " + tableName + " where IsDel=0 " + strWhere;
                object obj = DbHelperSQL.GetSingle(strsql);
                if (fieldName == "sort")
                {
                    if (obj == null)
                    {
                        return 0;
                    }
                    else
                    {
                        num = int.Parse(obj.ToString()) + 1;
                    }
                }
                else
                {
                    if (obj == null)
                    {
                        return 1;
                    }
                    else
                    {
                        num = int.Parse(obj.ToString());
                    }
                }
                return num;
            }
    
    
            public static bool Exists(string strSql)
            {
                object obj = GetSingle(strSql);
                int cmdresult;
                if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                {
                    cmdresult = 0;
                }
                else
                {
                    cmdresult = int.Parse(obj.ToString()); //也可能=0
                }
                if (cmdresult == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            /// <summary>
            /// 表是否存在
            /// </summary>
            /// <param name="TableName"></param>
            /// <returns></returns>
            public static bool TabExists(string TableName)
            {
                string strsql = "select count(*) from sysobjects where id = object_id(N'[" + TableName + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1";
                //string strsql = "SELECT count(*) FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + TableName + "]') AND type in (N'U')";
                object obj = GetSingle(strsql);
                int cmdresult;
                if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                {
                    cmdresult = 0;
                }
                else
                {
                    cmdresult = int.Parse(obj.ToString());
                }
                if (cmdresult == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            public static bool Exists(string strSql, params SqlParameter[] cmdParms)
            {
                object obj = GetSingle(strSql, cmdParms);
                int cmdresult;
                if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                {
                    cmdresult = 0;
                }
                else
                {
                    cmdresult = int.Parse(obj.ToString());
                }
                if (cmdresult == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            #endregion
    
            #region  执行简单SQL语句
    
            /// <summary>
            /// 执行SQL语句,返回影响的记录数
            /// </summary>
            /// <param name="SQLString">SQL语句</param>
            /// <returns>影响的记录数</returns>
            public static  int ExecuteSql(string SQLString)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(SQLString, connection))
                    {
                        try
                        {
                            connection.Open();
                            int rows = cmd.ExecuteNonQuery();
                            return rows;
                        }
                        catch (System.Data.SqlClient.SqlException e)
                        {
                            connection.Close();
                            throw e;
                        }
                    }
                }
            }
    
            /// <summary>
            /// 执行Sql和Oracle滴混合事务
            /// </summary>
            /// <param name="list">SQL命令行列表</param>
            /// <param name="oracleCmdSqlList">Oracle命令行列表</param>
            /// <returns>执行结果 0-由于SQL造成事务失败 -1 由于Oracle造成事务失败 1-整体事务执行成功</returns>
            public static int ExecuteSqlTran(List<CommandInfo> list, List<CommandInfo> oracleCmdSqlList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    SqlTransaction tx = conn.BeginTransaction();
                    cmd.Transaction = tx;
                    try
                    {
                        foreach (CommandInfo myDE in list)
                        {
                            string cmdText = myDE.CommandText;
                            SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
                            PrepareCommand(cmd, conn, tx, cmdText, cmdParms);
                            if (myDE.EffentNextType == EffentNextType.SolicitationEvent)
                            {
                                if (myDE.CommandText.ToLower().IndexOf("count(") == -1)
                                {
                                    tx.Rollback();
                                    throw new Exception("违背要求" + myDE.CommandText + "必须符合select count(..的格式");
                                    //return 0;
                                }
    
                                object obj = cmd.ExecuteScalar();
                                bool isHave = false;
                                if (obj == null && obj == DBNull.Value)
                                {
                                    isHave = false;
                                }
                                isHave = Convert.ToInt32(obj) > 0;
                                if (isHave)
                                {
                                    //引发事件
                                    myDE.OnSolicitationEvent();
                                }
                            }
                            if (myDE.EffentNextType == EffentNextType.WhenHaveContine || myDE.EffentNextType == EffentNextType.WhenNoHaveContine)
                            {
                                if (myDE.CommandText.ToLower().IndexOf("count(") == -1)
                                {
                                    tx.Rollback();
                                    throw new Exception("SQL:违背要求" + myDE.CommandText + "必须符合select count(..的格式");
                                    //return 0;
                                }
    
                                object obj = cmd.ExecuteScalar();
                                bool isHave = false;
                                if (obj == null && obj == DBNull.Value)
                                {
                                    isHave = false;
                                }
                                isHave = Convert.ToInt32(obj) > 0;
    
                                if (myDE.EffentNextType == EffentNextType.WhenHaveContine && !isHave)
                                {
                                    tx.Rollback();
                                    throw new Exception("SQL:违背要求" + myDE.CommandText + "返回值必须大于0");
                                    //return 0;
                                }
                                if (myDE.EffentNextType == EffentNextType.WhenNoHaveContine && isHave)
                                {
                                    tx.Rollback();
                                    throw new Exception("SQL:违背要求" + myDE.CommandText + "返回值必须等于0");
                                    //return 0;
                                }
                                continue;
                            }
                            int val = cmd.ExecuteNonQuery();
                            if (myDE.EffentNextType == EffentNextType.ExcuteEffectRows && val == 0)
                            {
                                tx.Rollback();
                                throw new Exception("SQL:违背要求" + myDE.CommandText + "必须有影响行");
                                //return 0;
                            }
                            cmd.Parameters.Clear();
                        }
                        //string oraConnectionString = PubConstant.GetConnectionString("ConnectionStringPPC");
                        //bool res = OracleHelper.ExecuteSqlTran(oraConnectionString, oracleCmdSqlList);
                        //if (!res)
                        //{
                        //    tx.Rollback();
                        //    throw new Exception("Oracle执行失败");
                        //    // return -1;
                        //}
                        tx.Commit();
                        return 1;
                    }
                    catch (System.Data.SqlClient.SqlException e)
                    {
                        tx.Rollback();
                        throw e;
                    }
                    catch (Exception e)
                    {
                        tx.Rollback();
                        throw e;
                    }
                }
            }
            /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">多条SQL语句</param>        
            public static int ExecuteSqlTran(List<String> SQLStringList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    SqlTransaction tx = conn.BeginTransaction();
                    cmd.Transaction = tx;
                    try
                    {
                        int count = 0;
                        for (int n = 0; n < SQLStringList.Count; n++)
                        {
                            string strsql = SQLStringList[n];
                            if (strsql.Trim().Length > 1)
                            {
                                cmd.CommandText = strsql;
                                count += cmd.ExecuteNonQuery();
                            }
                        }
                        tx.Commit();
                        return count;
                    }
                    catch
                    {
                        tx.Rollback();
                        return 0;
                    }
                }
            }
            /// <summary>
            /// 执行带一个存储过程参数的的SQL语句。
            /// </summary>
            /// <param name="SQLString">SQL语句</param>
            /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
            /// <returns>影响的记录数</returns>
            public static int ExecuteSql(string SQLString, string content)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlCommand cmd = new SqlCommand(SQLString, connection);
                    System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
                    myParameter.Value = content;
                    cmd.Parameters.Add(myParameter);
                    try
                    {
                        connection.Open();
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                    catch (System.Data.SqlClient.SqlException e)
                    {
                        throw e;
                    }
                    finally
                    {
                        cmd.Dispose();
                        connection.Close();
                    }
                }
            }
            /// <summary>
            /// 执行带一个存储过程参数的的SQL语句。
            /// </summary>
            /// <param name="SQLString">SQL语句</param>
            /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
            /// <returns>影响的记录数</returns>
            public static object ExecuteSqlGet(string SQLString, string content)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlCommand cmd = new SqlCommand(SQLString, connection);
                    System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
                    myParameter.Value = content;
                    cmd.Parameters.Add(myParameter);
                    try
                    {
                        connection.Open();
                        object obj = cmd.ExecuteScalar();
                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            return null;
                        }
                        else
                        {
                            return obj;
                        }
                    }
                    catch (System.Data.SqlClient.SqlException e)
                    {
                        throw e;
                    }
                    finally
                    {
                        cmd.Dispose();
                        connection.Close();
                    }
                }
            }
            /// <summary>
            /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
            /// </summary>
            /// <param name="strSQL">SQL语句</param>
            /// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
            /// <returns>影响的记录数</returns>
            public static int ExecuteSqlInsertImg(string strSQL, byte[] fs)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlCommand cmd = new SqlCommand(strSQL, connection);
                    System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@fs", SqlDbType.Image);
                    myParameter.Value = fs;
                    cmd.Parameters.Add(myParameter);
                    try
                    {
                        connection.Open();
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                    catch (System.Data.SqlClient.SqlException e)
                    {
                        throw e;
                    }
                    finally
                    {
                        cmd.Dispose();
                        connection.Close();
                    }
                }
            }
    
            /// <summary>
            /// 执行一条计算查询结果语句,返回查询结果(object)。
            /// </summary>
            /// <param name="SQLString">计算查询结果语句</param>
            /// <returns>查询结果(object)</returns>
            public static object GetSingle(string SQLString)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(SQLString, connection))
                    {
                        try
                        {
                            connection.Open();
                            object obj = cmd.ExecuteScalar();
                            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                            {
                                return null;
                            }
                            else
                            {
                                return obj;
                            }
                        }
                        catch (System.Data.SqlClient.SqlException e)
                        {
                            connection.Close();
                            throw e;
                        }
                    }
                }
            }
            public static object GetSingle(string SQLString, int Times)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(SQLString, connection))
                    {
                        try
                        {
                            connection.Open();
                            cmd.CommandTimeout = Times;
                            object obj = cmd.ExecuteScalar();
                            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                            {
                                return null;
                            }
                            else
                            {
                                return obj;
                            }
                        }
                        catch (System.Data.SqlClient.SqlException e)
                        {
                            connection.Close();
                            throw e;
                        }
                    }
                }
            }
            /// <summary>
            /// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
            /// </summary>
            /// <param name="strSQL">查询语句</param>
            /// <returns>SqlDataReader</returns>
            public static SqlDataReader ExecuteReader(string strSQL)
            {
                SqlConnection connection = new SqlConnection(connectionString);
                SqlCommand cmd = new SqlCommand(strSQL, connection);
                try
                {
                    connection.Open();
                    SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    return myReader;
                }
                catch (System.Data.SqlClient.SqlException e)
                {
                    throw e;
                }
    
            }
            /// <summary>
            /// 执行查询语句,返回DataSet
            /// </summary>
            /// <param name="SQLString">查询语句</param>
            /// <returns>DataSet</returns>
            public static DataSet Query(string SQLString)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    DataSet ds = new DataSet();
                    try
                    {
                        connection.Open();
                        SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
                        command.Fill(ds, "ds");
                    }
                    catch (System.Data.SqlClient.SqlException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                    return ds;
                }
            }
            public static DataSet Query(string SQLString, int Times)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    DataSet ds = new DataSet();
                    try
                    {
                        connection.Open();
                        SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
                        command.SelectCommand.CommandTimeout = Times;
                        command.Fill(ds, "ds");
                    }
                    catch (System.Data.SqlClient.SqlException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                    return ds;
                }
            }
    
    
    
            #endregion
    
            #region 执行带参数的SQL语句
    
            /// <summary>
            /// 执行SQL语句,返回影响的记录数
            /// </summary>
            /// <param name="SQLString">SQL语句</param>
            /// <returns>影响的记录数</returns>
            public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand())
                    {
                        try
                        {
                            PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                            int rows = cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();
                            return rows;
                        }
                        catch (System.Data.SqlClient.SqlException e)
                        {
                            throw e;
                        }
                    }
                }
            }
            public static int ExecuteSqlList(string SQLString, List<SqlParameter[]> cmdParms)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand())
                    {
                        try
                        {
                            PrepareCommandList(cmd, connection, null, SQLString, cmdParms);
                            int rows = cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();
                            return rows;
                        }
                        catch (System.Data.SqlClient.SqlException e)
                        {
                            throw e;
                        }
                    }
                }
            }
    
            /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
            public static bool ExecuteSqlTran(Hashtable SQLStringList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            //循环
                            foreach (DictionaryEntry myDE in SQLStringList)
                            {
                                string cmdText = myDE.Key.ToString();
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                                int val = cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        }
                        catch
                        {
                            trans.Rollback();
                            return false;
                        }
                    }
                }
                return true;
            }
            /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
            public static int ExecuteSqlTran(System.Collections.Generic.List<CommandInfo> cmdList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            int count = 0;
                            //循环
                            foreach (CommandInfo myDE in cmdList)
                            {
                                string cmdText = myDE.CommandText;
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
    
                                if (myDE.EffentNextType == EffentNextType.WhenHaveContine || myDE.EffentNextType == EffentNextType.WhenNoHaveContine)
                                {
                                    if (myDE.CommandText.ToLower().IndexOf("count(") == -1)
                                    {
                                        trans.Rollback();
                                        return 0;
                                    }
    
                                    object obj = cmd.ExecuteScalar();
                                    bool isHave = false;
                                    if (obj == null && obj == DBNull.Value)
                                    {
                                        isHave = false;
                                    }
                                    isHave = Convert.ToInt32(obj) > 0;
    
                                    if (myDE.EffentNextType == EffentNextType.WhenHaveContine && !isHave)
                                    {
                                        trans.Rollback();
                                        return 0;
                                    }
                                    if (myDE.EffentNextType == EffentNextType.WhenNoHaveContine && isHave)
                                    {
                                        trans.Rollback();
                                        return 0;
                                    }
                                    continue;
                                }
                                int val = cmd.ExecuteNonQuery();
                                count += val;
                                if (myDE.EffentNextType == EffentNextType.ExcuteEffectRows && val == 0)
                                {
                                    trans.Rollback();
                                    return 0;
                                }
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                            return count;
                        }
                        catch
                        {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
            }
            /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
            public static void ExecuteSqlTranWithIndentity(System.Collections.Generic.List<CommandInfo> SQLStringList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            int indentity = 0;
                            //循环
                            foreach (CommandInfo myDE in SQLStringList)
                            {
                                string cmdText = myDE.CommandText;
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.InputOutput)
                                    {
                                        q.Value = indentity;
                                    }
                                }
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                                int val = cmd.ExecuteNonQuery();
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.Output)
                                    {
                                        indentity = Convert.ToInt32(q.Value);
                                    }
                                }
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        }
                        catch
                        {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
            }
            /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
            public static void ExecuteSqlTranWithIndentity(Hashtable SQLStringList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            int indentity = 0;
                            //循环
                            foreach (DictionaryEntry myDE in SQLStringList)
                            {
                                string cmdText = myDE.Key.ToString();
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.InputOutput)
                                    {
                                        q.Value = indentity;
                                    }
                                }
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                                int val = cmd.ExecuteNonQuery();
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.Output)
                                    {
                                        indentity = Convert.ToInt32(q.Value);
                                    }
                                }
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        }
                        catch
                        {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
            }
            /// <summary>
            /// 执行一条计算查询结果语句,返回查询结果(object)。
            /// </summary>
            /// <param name="SQLString">计算查询结果语句</param>
            /// <returns>查询结果(object)</returns>
            public static object GetSingle(string SQLString, params SqlParameter[] cmdParms)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand())
                    {
                        try
                        {
                            PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                            object obj = cmd.ExecuteScalar();
                            cmd.Parameters.Clear();
                            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                            {
                                return null;
                            }
                            else
                            {
                                return obj;
                            }
                        }
                        catch (System.Data.SqlClient.SqlException e)
                        {
                            throw e;
                        }
                    }
                }
            }
    
            /// <summary>
            /// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
            /// </summary>
            /// <param name="strSQL">查询语句</param>
            /// <returns>SqlDataReader</returns>
            public static SqlDataReader ExecuteReader(string SQLString, params SqlParameter[] cmdParms)
            {
                SqlConnection connection = new SqlConnection(connectionString);
                SqlCommand cmd = new SqlCommand();
                try
                {
                    PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                    SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    cmd.Parameters.Clear();
                    return myReader;
                }
                catch (System.Data.SqlClient.SqlException e)
                {
                    throw e;
                }
                //            finally
                //            {
                //                cmd.Dispose();
                //                connection.Close();
                //            }    
    
            }
    
            /// <summary>
            /// 执行查询语句,返回DataSet
            /// </summary>
            /// <param name="SQLString">查询语句</param>
            /// <returns>DataSet</returns>
            public static DataSet Query(string SQLString, params SqlParameter[] cmdParms)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlCommand cmd = new SqlCommand();
                    PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        DataSet ds = new DataSet();
                        try
                        {
                            da.Fill(ds, "ds");
                            cmd.Parameters.Clear();
                        }
                        catch (System.Data.SqlClient.SqlException ex)
                        {
                            throw new Exception(ex.Message);
                        }
                        return ds;
                    }
                }
            }
    
    
            private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
            {
                try
                {
                    if (conn.State != ConnectionState.Open)
                        conn.Open();
                }
                catch { conn.Open(); }
                cmd.Connection = conn;
                cmd.CommandText = cmdText;
                if (trans != null)
                    cmd.Transaction = trans;
                cmd.CommandType = CommandType.Text;//cmdType;
                if (cmdParms != null)
                {
    
    
                    foreach (SqlParameter parameter in cmdParms)
                    {
                        if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                            (parameter.Value == null))
                        {
                            parameter.Value = DBNull.Value;
                        }
                        cmd.Parameters.Add(parameter);
                    }
                }
            }
    
    
            private static void PrepareCommandList(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, List<SqlParameter[]> cmdParms)
            {
                try
                {
                    if (conn.State != ConnectionState.Open)
                        conn.Open();
                }
                catch { conn.Open(); }
                cmd.Connection = conn;
                cmd.CommandText = cmdText;
                if (trans != null)
                    cmd.Transaction = trans;
                cmd.CommandType = CommandType.Text;//cmdType;
                if (cmdParms.Count != 0)
                {
                    foreach (var item in cmdParms)
                    {
                        if (item != null)
                        {
                            foreach (SqlParameter parameter in item)
                            {
                                if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                                    (parameter.Value == null))
                                {
                                    parameter.Value = DBNull.Value;
                                }
                                cmd.Parameters.Add(parameter);
                            }
                        }
    
    
                    }
                }
            }
            #endregion
    
            #region 存储过程操作
    
            /// <summary>
            /// 执行存储过程,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
            /// </summary>
            /// <param name="storedProcName">存储过程名</param>
            /// <param name="parameters">存储过程参数</param>
            /// <returns>SqlDataReader</returns>
            public static SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters)
            {
                SqlConnection connection = new SqlConnection(connectionString);
                SqlDataReader returnReader;
                connection.Open();
                SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
                command.CommandType = CommandType.StoredProcedure;
                returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
                return returnReader;
    
            }
    
    
            /// <summary>
            /// 执行存储过程
            /// </summary>
            /// <param name="storedProcName">存储过程名</param>
            /// <param name="parameters">存储过程参数</param>
            /// <param name="tableName">DataSet结果中的表名</param>
            /// <returns>DataSet</returns>
            public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    DataSet dataSet = new DataSet();
                    connection.Open();
                    SqlDataAdapter sqlDA = new SqlDataAdapter();
                    try
                    {
    
                        sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
                        sqlDA.Fill(dataSet, tableName);
                    }
                    catch (Exception e)
                    {
    
                        throw e;
                    }
                    connection.Close();
                    return dataSet;
                }
            }
            public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName, int Times)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    DataSet dataSet = new DataSet();
                    connection.Open();
                    SqlDataAdapter sqlDA = new SqlDataAdapter();
                    sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
                    sqlDA.SelectCommand.CommandTimeout = Times;
                    sqlDA.Fill(dataSet, tableName);
                    connection.Close();
                    return dataSet;
                }
            }
    
    
            /// <summary>
            /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
            /// </summary>
            /// <param name="connection">数据库连接</param>
            /// <param name="storedProcName">存储过程名</param>
            /// <param name="parameters">存储过程参数</param>
            /// <returns>SqlCommand</returns>
            private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
            {
                SqlCommand command = new SqlCommand(storedProcName, connection);
                command.CommandType = CommandType.StoredProcedure;
                foreach (SqlParameter parameter in parameters)
                {
                    if (parameter != null)
                    {
                        // 检查未分配值的输出参数,将其分配以DBNull.Value.
                        if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                            (parameter.Value == null))
                        {
                            parameter.Value = DBNull.Value;
                        }
                        command.Parameters.Add(parameter);
                    }
                }
    
                return command;
            }
    
            /// <summary>
            /// 执行存储过程,返回影响的行数        
            /// </summary>
            /// <param name="storedProcName">存储过程名</param>
            /// <param name="parameters">存储过程参数</param>
            /// <param name="rowsAffected">影响的行数</param>
            /// <returns></returns>
            public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    int result;
                    connection.Open();
                    SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
                    rowsAffected = command.ExecuteNonQuery();
                    result = (int)command.Parameters["ReturnValue"].Value;
                    //Connection.Close();
                    return result;
                }
            }
    
            /// <summary>
            /// 创建 SqlCommand 对象实例(用来返回一个整数值)    
            /// </summary>
            /// <param name="storedProcName">存储过程名</param>
            /// <param name="parameters">存储过程参数</param>
            /// <returns>SqlCommand 对象实例</returns>
            private static SqlCommand BuildIntCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
            {
                SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
                command.Parameters.Add(new SqlParameter("ReturnValue",
                    SqlDbType.Int, 4, ParameterDirection.ReturnValue,
                    false, 0, 0, string.Empty, DataRowVersion.Default, null));
                return command;
            }
            #endregion
    
            #region >>删除<<
            /// <summary>
            /// 执行删除
            /// </summary>
            /// <param name="table">表名</param>
            /// <param name="keyValue">主键值</param>
            /// <param name="keyName">主键字段名称</param>
            /// <returns>删除结果</returns>
            public static int Delete(string table, string keyValue, string keyName = "Id")
            {
                string sql = string.Format("DELETE FROM {0} WHERE {1}=@Id", table, keyName);
                var args = new ArrayList() { new SqlParameter("@Id", keyValue) };
                return ExecuteSql(sql, args);
            }
    
            /// <summary>
            /// 根据查询条件删除
            /// </summary>
            /// <param name="table"></param>
            /// <param name="htCondition"></param>
            /// <returns></returns>
            public static int Delete(string table, Hashtable htCondition)
            {
                ArrayList args;
                string conditionStr = GetConditionString(htCondition, out args);
                string sql = string.Format("DELETE FROM {0} WHERE 1=1{1}", table, conditionStr);
                return ExecuteSql(sql, args);
            }
            #endregion
    
            #region >>新增<<
            /// <summary>
            /// 执行插入
            /// </summary>
            /// <param name="table">表名</param>
            /// <param name="htFilds">字段和值</param>
            /// <returns>结果</returns>
            public static int Insert(string table, Hashtable htField)
            {
                ArrayList args;
                string sql = GetInsertSql(table, htField, out args);
    
                return ExecuteSql(sql, args);
            }
    
            /// <summary>
            /// 执行插入,返回ID
            /// </summary>
            /// <param name="table">表名</param>
            /// <param name="htField">字段和值</param>
            /// <param name="keyValue">ID</param>
            public static void Insert(string table, Hashtable htField, out string keyValue)
            {
                ArrayList args;
                string sql = string.Format("{0};SELECT @@IDENTITY", GetInsertSql(table, htField, out args));
    
                keyValue = Convert.ToString(ExecuteScalar(sql, args));
            }
            /// <summary>
            /// 使用DataTable插入数据
            /// </summary>
            /// <param name="dt"></param>
            /// <param name="table"></param>
            /// <returns></returns>
            public static int Insert(DataTable dt, string table = "")
            {
                if (table == "")
                {
                    table = dt.TableName;
                }
                int r = 0;
                foreach (DataRow dr in dt.Rows)
                {
                    Hashtable htField = new Hashtable();
                    foreach (DataColumn dc in dt.Columns)
                    {
                        htField.Add(dc.ColumnName, dr[dc.ColumnName]);
                    }
                    r += Insert(table, htField);
                }
                return r;
            }
            /// <summary>
            /// 使用DataTable插入数据,只适合插入一条
            /// </summary>
            /// <param name="dt"></param>
            /// <param name="keyValue">返回主键</param>
            /// <param name="table"></param>
            public static void Insert(DataTable dt, out string keyValue, string table = "")
            {
                keyValue = "";
                if (table == "")
                {
                    table = dt.TableName;
                }
    
                foreach (DataRow dr in dt.Rows)
                {
                    Hashtable htField = new Hashtable();
                    foreach (DataColumn dc in dt.Columns)
                    {
                        htField.Add(dc.ColumnName, dr[dc.ColumnName]);
                    }
                    Insert(table, htField, out keyValue);
                }
            }
            /// <summary>
            /// 获取插入语句Sql
            /// </summary>
            /// <param name="table"></param>
            /// <param name="htField"></param>
            /// <param name="args"></param>
            /// <returns></returns>
            private static string GetInsertSql(string table, Hashtable htField, out ArrayList args)
            {
                args = new ArrayList();
                var sbField = new StringBuilder();
                var sbValue = new StringBuilder();
    
                foreach (DictionaryEntry de in htField)
                {
                    // 参数集合
                    args.Add(new SqlParameter(de.Key.ToString(), de.Value));
                    // 字段和值
                    sbField.AppendFormat("[{0}],", de.Key.ToString());
                    sbValue.AppendFormat("@{0},", de.Key.ToString());
                }
    
                return string.Format
                (
                    "INSERT INTO {0}({1})VALUES({2});",
                    table,
                    sbField.ToString().TrimEnd(','),
                    sbValue.ToString().TrimEnd(',')
                );
            }
    
            #endregion
    
            #region >>更新<<
            /// <summary>
            /// 执行更新
            /// </summary>
            /// <param name="table">表名</param>
            /// <param name="htFilds">字段和值</param>
            /// <param name="keyValue">主键值</param>
            /// <param name="keyName">主键字段名称</param>
            /// <returns>结果</returns>
            public static int Update(string table, Hashtable htField, string keyValue, string keyName = "Id")
            {
                var args = new ArrayList();
                var sbField = new StringBuilder();
    
                foreach (DictionaryEntry de in htField)
                {
                    // 参数集合
                    args.Add(new SqlParameter(de.Key.ToString(), de.Value));
                    // 要更新的字段
                    sbField.AppendFormat("{0}=@{0},", de.Key);
                }
    
                // 添加ID
                args.Add(new SqlParameter(keyName, keyValue));
    
                string sql = string.Format("UPDATE {0} SET {1} WHERE {2}=@{2} ", table, sbField.ToString().TrimEnd(','), keyName);
    
                return ExecuteSql(sql, args);
    
            }
    
            /// <summary>
            /// 执行更新
            /// </summary>
            /// <param name="table">表名</param>
            /// <param name="htField">字段和值</param>
            /// <param name="htCondition">查询条件</param>
            /// <returns></returns>
            public static int Update(string table, Hashtable htField, Hashtable htCondition)
            {
                // 更新字段和值
                ArrayList args;
                var sbField = new StringBuilder();
    
                // 查询字段和值
                string condition = GetConditionString(htCondition, out args);
    
                foreach (DictionaryEntry de in htField)
                {
                    // 参数集合
                    args.Add(new SqlParameter("@AutoKey_" + de.Key, de.Value));
                    // 要更新的字段
                    sbField.AppendFormat("{0}=@AutoKey_{0},", de.Key);
                }
    
                // 拼接查询结果
                string sql = string.Format
                (
                    "UPDATE {0} SET {1} WHERE 1=1{2}",
                    table,
                    sbField.ToString().TrimEnd(','),
                    condition
                );
    
                return ExecuteSql(sql, args);
    
            }
            /// <summary>
            /// 执行更新
            /// </summary>
            /// <param name="table">表名</param>
            /// <param name="htField">字段和值</param>
            /// <param name="htCondition">查询条件</param>
            /// <returns></returns>
            public static int Update(string table, Hashtable htField, string condition)
            {
                // 更新字段和值
                ArrayList args = new ArrayList();
                var sbField = new StringBuilder();
    
                // 查询字段和值
                //string condition = GetConditionString(htCondition, out args);
    
                foreach (DictionaryEntry de in htField)
                {
                    // 参数集合
                    args.Add(new SqlParameter(de.Key.ToString(), de.Value));
                    // 要更新的字段
                    sbField.AppendFormat("{0}=@{0},", de.Key);
                }
    
                // 拼接查询结果
                string sql = string.Format
                (
                    "UPDATE {0} SET {1} WHERE 1=1 AND {2}",
                    table,
                    sbField.ToString().TrimEnd(','),
                    condition
                );
    
                return ExecuteSql(sql, args);
    
            }
            public static int Update(DataTable dt, string keyName, string keyValue, string table = "")
            {
                int num = 0;
                if (table == "")
                {
                    table = dt.TableName;
                }
                string condition = keyName + "='" + keyValue + "'";
                foreach (DataRow dr in dt.Rows)
                {
                    Hashtable htField = new Hashtable();
                    foreach (DataColumn dc in dt.Columns)
                    {
                        htField.Add(dc.ColumnName, dr[dc.ColumnName]);
                    }
                    num += Update(table, htField, condition);
                }
                return num;
            }
            #endregion
    
            #region >>获取单个字段的值<<
            /// <summary>
            /// 获取单个字段值
            /// </summary>
            /// <param name="tableName">表名</param>
            /// <param name="field">字段名</param>
            /// <param name="keyValue">主键值</param>
            /// <param name="keyName">主键字段名称</param>
            /// <returns></returns>
            public static string GetFieldValue(string table, string field, string keyValue, string keyName = "Id")
            {
                // 执行查询
                var args = new ArrayList { new SqlParameter(keyName, keyValue) };
                var sql = string.Format("SELECT {0} FROM {1} WHERE {2}=@{2}", field, table, keyName);
    
                // 执行查询
                var result = ExecuteScalar(sql, args);
    
                // 没有查到任何结果
                if (result == null) return null;
    
                // 如果结果中包含多表连接查询,去除(.),如(a.Name)去除(a.)
                return result.ToString();
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="table"></param>
            /// <param name="field"></param>
            /// <param name="htCondition"></param>
            /// <param name="order"></param>
            /// <returns></returns>
            public static string GetFieldValue(string table, string field, Hashtable htCondition, string order)
            {
                // 查询条件和参数
                ArrayList args;
                var sql = string.Format("SELECT {0} FROM {1} WHERE 1=1{2}", field, table, GetConditionString(htCondition, out args));
    
                // 查询条件
                if (!string.IsNullOrEmpty(order)) sql += " " + order;
    
                // 执行查询
                object result = ExecuteScalar(sql, args);
    
                if (result == null) return null;
    
                return result.ToString();
            }
            #endregion
    
            #region >>获取记录数量<<
            /// <summary>
            /// 获取记录数量
            /// </summary>
            /// <param name="table">表名</param>
            /// <param name="htCondtion">查询条件</param>
            /// <returns></returns>
            public static int GetRecordCount(string table, Hashtable htCondition)
            {
                // 查询条件和参数
                ArrayList args;
                string sql = string.Format("SELECT COUNT(*) FROM {0} WHERE 1=1{1}", table, GetConditionString(htCondition, out args));
    
                // 执行查询
                return Convert.ToInt32(ExecuteScalar(sql, args));
            }
            #endregion
    
            #region >>判断是否存在<<
            /// <summary>
            /// 判断是否存在
            /// </summary>
            /// <param name="tableName">表名</param>
            /// <param name="htCondtion">查询条件</param>
            /// <returns></returns>
            public static bool Exists(string table, Hashtable htCondition)
            {
                // 查询条件和参数
                ArrayList args;
                string sql = string.Format("SELECT COUNT(*) FROM {0} WHERE 1=1{1}", table, GetConditionString(htCondition, out args));
    
                // 执行查询
                object result = ExecuteScalar(sql, args);
    
                // 返回结果
                if (result == null) { return false; }
                if (result.ToString() == "0") { return false; }
                return true;
            }
    
            /// <summary>
            /// 判断是否存在
            /// </summary>
            /// <param name="table">表名</param>
            /// <param name="keyValue">主键值</param>
            /// <param name="keyName">主键字段名称</param>
            /// <returns></returns>
            public static bool Exists(string table, string keyValue, string keyName = "Id")
            {
                var args = new ArrayList { new SqlParameter(keyName, keyValue) };
                string sql = string.Format("SELECT COUNT(*) FROM {0} WHERE {1}=@{1}", table, keyName);
    
                object result = ExecuteScalar(sql, args);
    
                if (result == null) { return false; }
                if (result.ToString() == "0") { return false; }
                return true;
            }
            #endregion
    
            #region >>获取查询条件字符串<<
            /// <summary>
            /// 获取查询条件字符串
            /// </summary>
            /// <param name="htCondition">查询条件</param>
            /// <param name="args">参数集合</param>
            /// <returns></returns>
            public static string GetConditionString(Hashtable htCondition, out ArrayList args)
            {
                args = new ArrayList();
                var sbCondition = new StringBuilder();
    
                // 拼接查询条件
                foreach (DictionaryEntry de in htCondition)
                {
                    if (de.Key.ToString().IndexOf(' ') != -1)
                    {
                        sbCondition.AppendFormat(" AND {0}", de.Key);
                        if (de.Value != null && !string.IsNullOrWhiteSpace(de.Value.ToString()))
                        {
                            args.Add(de.Value as SqlParameter);
                        }
                        continue;
                    }
    
                    sbCondition.AppendFormat(" AND {0}=@{0}", de.Key);
                    args.Add(new SqlParameter(de.Key.ToString(), de.Value));
                }
    
                // 返回查询条件字符串
                return sbCondition.ToString();
            }
            #endregion
    
            #region >>多表查询<<
            /// <summary>
            /// 多表查询 - 通过ID获取
            /// </summary>
            /// <param name="field">要查询的字段,如:* | Id,Field</param>
            /// <param name="table">表名</param>
            /// <param name="keyValue">主键值</param>
            /// <param name="keyName">主键字段名称</param>
            /// <returns></returns>
            public static DataTable GetDataTable(string field, string table, string keyValue, string keyName = "Id")
            {
                ArrayList args = new ArrayList() { new SqlParameter(keyName, keyValue) };
                string sql = string.Format("SELECT {0} FROM {1} WHERE {2}=@{2}", field, table, keyName);
                return GetDataTable(sql, args);
            }
    
            /// <summary>
            /// 多表查询 - 通过传入where 字符串 条件 来查询
            /// </summary>
            /// <param name="field">要查询的字段,如:* | Id,Field</param>
            /// <param name="table">表名</param>
            /// <param name="strWhere">查询条件 多个条件注意用and拼接</param>
            /// <returns></returns>
            public static DataTable GetDataTable(string field, string table, string strWhere)
            {
                string sql = string.Format("SELECT {0} FROM {1} {2}", field, table, strWhere);
                return GetDataTable(sql);
            }
    
            /// <summary>
            /// 多表查询 - 通过查询条件获取
            /// </summary>
            /// <param name="field">查询字段,如: A.Field, B.Field</param>
            /// <param name="table">表名,如: TableOne as A, TableTwo as B</param>
            /// <param name="htCondition">查询条件</param>
            ///  <param name="order">排序,包括字段及排序方式(如:ordernum desc),也可以用""不排序</param>
            /// <returns></returns>
            public static DataTable GetDataTable(string field, string table, Hashtable htCondition, string order)
            {
                ArrayList args;
                string condition = GetConditionString(htCondition, out args);
    
                string sql = string.Format("SELECT {0} FROM {1} WHERE 1=1 {2}{3}", field, table, condition,
                    string.IsNullOrWhiteSpace(order) ? "" : " ORDER BY " + order);
    
                return GetDataTable(sql, args);
            }
    
            /// <summary>
            /// 多表分组查询 - 通过查询条件获取
            /// </summary>
            /// <param name="field">查询字段,如: A.Field, B.Field</param>
            /// <param name="table">表名,如: TableOne as A, TableTwo as B</param>
            /// <param name="htCondition">查询条件</param>
            ///  <param name="order">排序,包括字段及排序方式(如:ordernum desc),也可以用""不排序</param>
            /// <returns></returns>
            public static DataTable GetDataTable(string field, string table, Hashtable htCondition, string group, string order, bool IsAddNumber = false)
            {
                ArrayList args;
                string condition = GetConditionString(htCondition, out args);
    
                string sql = string.Format("SELECT {0} FROM {1} WHERE 1=1 {2} {3} {4}",
                    field, table, condition,
                    string.IsNullOrWhiteSpace(group) ? "" : " group by " + group,
                    string.IsNullOrWhiteSpace(order) ? "" : order);
                if (IsAddNumber)
                {
                    sql = string.Format("SELECT {0} FROM {1} WHERE 1=1 {2} {3}",
                    field, table, condition,
                    string.IsNullOrWhiteSpace(group) ? "" : " group by " + group);
                    sql = string.Format("SELECT ROW_NUMBER() OVER({0}) AS '序号',mydata.* FROM ({1}) mydata {0}", order, sql);
                }
                return GetDataTable(sql, args);
            }
    
            /// <summary>
            /// 多表查询 - 分页
            /// </summary>
            /// <param name="keyName">主键字段</param>
            /// <param name="field">要查询的字段,如:* | Id,Field</param>
            /// <param name="table">表名</param>
            /// <param name="htCondition">条件字符串</param>
            /// <param name="order">排序,包括排序字段和排序方式(如:id desc)</param>
            /// <param name="pageIndex">当前页码</param>
            /// <param name="pageSize">每页显示行数</param>
            /// <param name="recordCount">总行数</param>
            /// <param name="pageCount">总共页码数</param>
            /// <returns></returns>
            public static DataTable GetDataTable(string keyName, string field, string table, Hashtable htCondition, string order, int pageIndex, int pageSize, out int recordCount, out int pageCount)
            {
                ArrayList args;
                string condition = GetConditionString(htCondition, out args);
    
                return GetPageNavigateDataTable(keyName, field, table, condition, order, args, pageIndex, pageSize, out recordCount, out pageCount);
    
            } 
    
            /// <summary>
            /// 多表查询 - 通过存储过程获取
            /// </summary>
            /// <param name="procName">存储过程</param>
            /// <param name="htCondition">查询条件</param>
            /// <returns></returns>
            public static DataTable GetDataTableByProcName(string procName, Hashtable htCondition)
            {
                ArrayList args;
                string condition = GetConditionString(htCondition, out args);
    
                return ExecuteProcedureToDt(procName, args);
            }
            #endregion
    
            #region >>执行SQL语句<<
    
    
            /// <summary>
            /// 执行SQL语句,返回受影响的行数
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <param name="args">参数</param>
            /// <returns></returns>
            public static int ExecuteSql(string sql, ArrayList args)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, connection))
                    {
                        try
                        {
                            int result = 0;
                            connection.Open();
                            cmd.Parameters.AddRange(args.ToArray());
                            result = cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();
                            return result;
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
            }
            #endregion
    
            #region >>执行查询返回单个对象<<
            /// <summary>
            /// 执行查询返回单个对象
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns></returns>
            public static object ExecuteScalar(string sql)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, connection))
                    {
                        try
                        {
                            connection.Open();
                            object obj = cmd.ExecuteScalar();
                            if (Object.Equals(obj, null) || Object.Equals(obj, System.DBNull.Value)) { return null; } else { return obj; }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
    
            }
    
            /// <summary>
            /// 执行查询返回单个对象
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <param name="arg">参数</param>
            /// <returns></returns>
            public static object ExecuteScalar(string sql, ArrayList args)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, connection))
                    {
                        try
                        {
                            connection.Open();
                            cmd.Parameters.AddRange(args.ToArray());
                            object obj = cmd.ExecuteScalar();
                            cmd.Parameters.Clear();
                            if (Object.Equals(obj, null) || Object.Equals(obj, System.DBNull.Value)) { return null; } else { return obj; }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
    
            }
            #endregion
    
            #region >>执行存储过程<<
            /// <summary>
            /// 执行存储过程,返回单个对象
            /// </summary>
            /// <param name="procName">存储过程名称</param>
            /// <param name="args">参数</param>
            /// <returns>单个结果</returns>
            public static object ExecuteProcedure(string procName, ArrayList args)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(procName, connection))
                    {
                        try
                        {
    
                            connection.Open();
                            cmd.CommandType = CommandType.StoredProcedure;
                            cmd.Parameters.AddRange(args.ToArray());
                            object obj = cmd.ExecuteScalar();
                            cmd.Parameters.Clear();
                            if (Object.Equals(obj, null) || Object.Equals(obj, System.DBNull.Value)) { return null; }
                            return obj;
                        }
                        catch (SqlException ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
            }
    
            /// <summary>
            /// 执行存储过程,返回DataTable
            /// </summary>
            /// <param name="procName">存储过程名称</param>
            /// <param name="args">参数</param>
            /// <returns></returns>
            public static DataTable ExecuteProcedureToDt(string procName, ArrayList args)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(procName, connection))
                    {
                        DataTable dt = new DataTable();
                        try
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
                            var adapter = new SqlDataAdapter(cmd);
                            adapter.SelectCommand.Parameters.AddRange(args.ToArray());
                            adapter.Fill(dt);
                            adapter.SelectCommand.Parameters.Clear();
                            return dt;
                        }
                        catch (SqlException ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
            }
            #endregion
    
            #region >>执行查询获取DataTable<<
            /// <summary>
            /// 执行SQL语句 返回DataTable
            /// </summary>
            /// <param name="SQLString">SQL语句</param>
            /// <returns>DataTable</returns>
            public static DataTable GetDataTable(string sql)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlDataAdapter adapter = new SqlDataAdapter(sql, connection))
                    {
                        var dt = new DataTable();
                        try
                        {
                            adapter.Fill(dt);
                            return dt;
                        }
                        catch (SqlException ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
            }
    
            /// <summary>
            /// 执行SQL语句 返回DataTable
            /// </summary>
            /// <param name="SQLString">SQL语句</param>
            /// <param name="args">参数集合</param>
            /// <returns></returns>
            public static DataTable GetDataTable(string sql, ArrayList args)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlDataAdapter adapter = new SqlDataAdapter(sql, connection))
                    {
                        DataTable dt = new DataTable();
                        try
                        {
                            adapter.SelectCommand.Parameters.AddRange(args.ToArray());
                            adapter.Fill(dt);
                            adapter.SelectCommand.Parameters.Clear();
                            return dt;
                        }
                        catch (SqlException ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                }
            }
    
            /// <summary>
            /// 多表查询 - 分页
            /// </summary>
            /// <param name="keyName">主键字段</param>
            /// <param name="field">要查询的字段,如:* | Id,Field</param>
            /// <param name="table">表名</param>
            /// <param name="htCondition">条件字符串</param>
            /// <param name="order">排序,包括排序字段和排序方式(如:id desc)</param>
            /// <param name="pageIndex">当前页码</param>
            /// <param name="pageSize">每页显示行数</param>
            /// <param name="recordCount">总行数</param>
            /// <param name="pageCount">总共页码数</param>
            /// <returns></returns>
            public static DataTable GetPageNavigateDataTable(string keyName, string field, string table, string condition,
                string order, ArrayList args, int pageIndex, int pageSize, out int recordCount, out int pageCount)
            {
                // 获取记录数
                string sql = string.Format("SELECT COUNT (1) FROM {0} WHERE 1=1{1}", table, condition);
                recordCount = (int)ExecuteScalar(sql, args);
    
                // 获取页数
                pageCount = recordCount % pageSize == 0 ? recordCount / pageSize : recordCount / pageSize + 1;
    
                // 显示当前页的范围,下面两行上下顺序不可颠倒,如果颠倒,记录为0时会出现 负值
                if (pageIndex > pageCount) pageIndex = pageCount;
                if (pageIndex < 1) pageIndex = 1;
    
                // 判断排序参数order是否为空
                order = string.IsNullOrWhiteSpace(order) ? "ORDER BY " + keyName : order;
    
                // 执行查询
                if (pageIndex == 1)
                {
                    sql = string.Format("SELECT TOP {0} {1} FROM {2} WHERE 1=1{3} {4}", pageSize, field, table, condition, order);
                    return GetDataTable(sql, args);
                }
    
                string innerSql = string.Format("SELECT ROW_NUMBER() OVER ({0}) AS TempRowNumber,{1} FROM {2} WHERE 1=1{3}", order, field, table, condition);
    
                int startRowNumber = (pageIndex - 1) * pageSize + 1;
                int endRowNumber = startRowNumber + pageSize - 1;
                sql = string.Format("SELECT * FROM ({0}) AS TempTable WHERE TempRowNumber BETWEEN {1} AND {2}", innerSql, startRowNumber, endRowNumber);
    
                /* 原始的排序方式
                sql = "SELECT TOP " + pageSize + " " + field + " FROM " + table + " WHERE " + key + " NOT IN";
                sql += "(SELECT TOP " + (pageIndex - 1) * pageSize + " " + key + " FROM " + table + " WHERE 1=1" + condition + orderNew + ")";
                sql += condition + orderNew;*/
    
                // 返回查询结果
                return GetDataTable(sql, args);
            }
    
            /// <summary>
            /// 多表查询 - 分页扩展
            /// </summary>
            /// <param name="keyName">主键字段</param>
            /// <param name="field">要查询的字段,如:* | Id,Field</param>
            /// <param name="table">表名</param>
            /// <param name="htCondition">条件字符串</param>
            /// <param name="order">排序,包括排序字段和排序方式(如:id desc)</param>
            /// <param name="pageIndex">当前页码</param>
            /// <param name="pageSize">每页显示行数</param>
            /// <param name="recordCount">总行数</param>
            /// <param name="pageCount">总共页码数</param>
            /// <returns></returns>
            public DataTable GetPageNavigateDataTable(string keyName, string field, string table, string condition,
                string group, string order, ArrayList args, int pageIndex, int pageSize, out int recordCount, out int pageCount)
            {
                // 获取记录数
                string sql = string.Format("SELECT COUNT(1) from(select {0} FROM {1} WHERE 1=1{2} group by {3}) tmp", field, table, condition, group);
                recordCount = (int)ExecuteScalar(sql, args);
    
                // 获取页数
                pageCount = recordCount % pageSize == 0 ? recordCount / pageSize : recordCount / pageSize + 1;
    
                // 显示当前页的范围,下面两行上下顺序不可颠倒,如果颠倒,记录为0时会出现 负值
                if (pageIndex > pageCount) pageIndex = pageCount;
                if (pageIndex < 1) pageIndex = 1;
    
                //判断分组是否为空
                group = string.IsNullOrWhiteSpace(group) ? " " : " Group by " + group;
    
                // 判断排序参数order是否为空
                order = string.IsNullOrWhiteSpace(order) ? "ORDER BY " + keyName : order;
    
    
                // 执行查询
                if (pageIndex == 1)
                {
                    sql = string.Format("SELECT TOP {0} * from (select {1} FROM {2} WHERE 1=1{3} {4}) tmp {5}", pageSize, field, table, condition, group, order);
                    return GetDataTable(sql, args);
                }
    
                string innerSql = string.Format("SELECT ROW_NUMBER() OVER ({0}) AS TempRowNumber,* from (select {1} FROM {2} WHERE 1=1{3} {4}) tmp", order, field, table, condition, group);
    
                int startRowNumber = (pageIndex - 1) * pageSize + 1;
                int endRowNumber = startRowNumber + pageSize - 1;
                sql = string.Format("SELECT * FROM ({0}) AS TempTable WHERE TempRowNumber BETWEEN {1} AND {2}", innerSql, startRowNumber, endRowNumber);
    
                /* 原始的排序方式
                sql = "SELECT TOP " + pageSize + " " + field + " FROM " + table + " WHERE " + key + " NOT IN";
                sql += "(SELECT TOP " + (pageIndex - 1) * pageSize + " " + key + " FROM " + table + " WHERE 1=1" + condition + orderNew + ")";
                sql += condition + orderNew;*/
                // 返回查询结果
                return GetDataTable(sql, args);
            }
            #endregion
        }
    }
    DbHelperSQL.cs
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Utility.Helper
    {
        public static  class HelperConfig
        {
            /// <summary>
            /// object对象转string
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static string JsonConvertString(object obj) {
    
                return JsonConvert.SerializeObject(obj);
            }
        }
    }
    HelperConfig.cs

     Log(自定义)文件

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web;
    
    namespace Utility.log
    {
        public static class WriteLogConfig
        {
            /// <summary>
            /// 写入自定义日志
            /// </summary>
            /// <param name="file">文件</param>
            /// <param name="fileName">文件</param>
            /// <param name="source">来源备注</param>
            /// <param name="content">内容</param>
            public static void WriteLogInfo(string file, string fileName, string source, string content)
            {
                var filePath = AppDomain.CurrentDomain.BaseDirectory + file;
                if (!Directory.Exists(filePath))
                    Directory.CreateDirectory(filePath);
                //判断是否要创建txt
                var path = HttpContext.Current.Server.MapPath(@"/" + file + "/" + fileName + ".txt");
                if (!File.Exists(path))
                    File.Create(path).Close();
                using (StreamWriter w = File.AppendText(path))
                {
                    w.WriteLine("
    自定义日志: ");
                    w.WriteLine("记录时间:{0}", DateTime.Now);
                    w.WriteLine("记录来源:{0}", source);
                    w.WriteLine("记录内容:{0}", content);
                    w.WriteLine("________________________________________________________");
                    w.Flush();
                    w.Close();
                }
            }
        }
    }
    WriteLogConfig.cs

    四、Repository(仓储库):

      引用:Entity(实例化实体装数据)、Utility(调用Helper)、Dapper

      ①、IRepositories :存放声明方法的接口文件,主要用来声明 Repositories 中的方法;

      ②、Repositories  :存放实现方法的类文件,主要内容Sql操作数据库和业务逻辑;

      注:类库创建按照Entity的创建方法,将 自定义仿T4工具 生成的Repositories 和 IRepositories 代码。

      

      

        添加关联类库引用

      

        添加Dapper插件

      

      

        添加WebApi autofac 依赖注入,需添加Autofac、Autofac.WebApi2的扩展包和一个配置类。

      

      

      

      

    using Autofac;
    using Autofac.Integration.WebApi;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    using System.Web.Http;
    
    namespace TestDapper.App_Start
    {
        //注册依赖注入
        public class AutofacConfig_WebApi
        {
            public static void Register()
            {
                // 实例化一个Autofac的创建容器
                var builder = new ContainerBuilder();
    
                // 注册Api容器需要使用HttPConfiguration对象
                HttpConfiguration config = GlobalConfiguration.Configuration;
                SetupResolveRules(builder);
    
                //注册所有的ApiControllers
                builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
    
                // 创建一个Autofac的容器
                var container = builder.Build();
    
                // api的控制器对象由autofac来创建
                config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
            }
    
            //设置配置规则
            public static void SetupResolveRules(ContainerBuilder builder)
            {
                //依赖注入Repository程序集(实例化里面所有的类)
                Assembly RepositoryAssembly = Assembly.Load("Repository");
    
                //创建所有类的instance以此类的实现接口存储
                builder.RegisterTypes(RepositoryAssembly.GetTypes()).Where(a => a.Name.Contains("Repository")).AsImplementedInterfaces();
            }
        }
    }
    AutofacConfig_WebApi

      

      其中加了些自己的小想法。

    using System;
    using Entity.Models;
    using System.Collections.Generic;
    namespace Repository.IRepositories
    {
       public interface ITest_UserRepository
       {
    
           /// <summary>
           /// 新增单个Test_User对象(若主键是自增,需删除@主键)
           /// </summary>
           /// <param name="model">新增的对象</param>
           /// <returns>Test_User对象的主键</returns>
           int AddModel(Test_User model);
    
           /// <summary>
           /// 删除单个或多个Test_User对象
           /// </summary>
           /// <param name="where">查询需要删除的对象条件</param>
           /// <returns>sql操作的影响行数</returns>
           int DeleteModel(string where);
    
           /// <summary>
           /// 修改单个或多个Test_User对象
           /// </summary>
           /// <param name="model">修改的对象</param>
           /// <param name="where">查询需要修改的对象条件</param>
           /// <returns>sql操作的影响行数</returns>
            int UpdateModel(Test_User model,string where);
    
           /// <summary>
           /// 获取单个Test_User对象
           /// </summary>
           /// <param name="columnHead">显示列头</param>
           /// <param name="where">查询条件</param>
           /// <param name="order">排序条件</param>
           /// <returns>Test_User对象</returns>
           Test_User GetModel(string columnHead, string where, string order);
    
           /// <summary>
           ///  获取多个Test_User对象
           /// </summary>
           /// <param name="columnHead">显示列头</param>
           /// <param name="where">查询条件</param>
           /// <param name="order">排序条件</param>
           /// <returns>List<Test_User>对象</returns>
           List<Test_User> GetModelList(string columnHead, string where, string order);
    
       }
    }
    ITest_UserRepository
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Entity.Models;
    using Utility.Helper;
    using System.Data.SqlClient;
    using Repository.IRepositories;
    using Dapper;
    namespace Repository.Repositories
    {
       public class Test_UserRepository:ITest_UserRepository
       {
    
           /// <summary>
           /// 新增单个Test_User对象(若主键是自增,需删除@主键)
           /// </summary>
           /// <param name="model">新增的对象</param>
           /// <returns>Test_User对象的主键</returns>
           public int AddModel(Test_User model)
           {
               using (SqlConnection conn = new SqlConnection(DbHelperSQL.connectionString))
               {
                   var sql = new StringBuilder();
                   sql.Append(" insert into Test_User values(@id,@user_name,@age,@sex,@phone,@address,@create_time,@update_time) ");
                   sql.Append(" SELECT CAST(SCOPE_IDENTITY() as int) ");
                   return conn.QueryFirstOrDefault<int>(sql.ToString(), new { id=model.id,user_name=model.user_name,age=model.age,sex=model.sex,phone=model.phone,address=model.address,create_time=model.create_time,update_time=model.update_time }); 
               }
           }
    
           /// <summary>
           /// 删除单个或多个Test_User对象
           /// </summary>
           /// <param name="where">查询需要删除的对象条件</param>
           /// <returns>sql操作的影响行数</returns>
           public int DeleteModel(string where)
           {
               using (SqlConnection conn = new SqlConnection(DbHelperSQL.connectionString))
               {
                   var sql = new StringBuilder();
                   sql.Append(" delete Test_User where 1 = 1 ");
                   if (!string.IsNullOrWhiteSpace(where))
                       sql.Append(where);
                   return conn.Execute(sql.ToString());
               }
           }
    
           /// <summary>
           /// 修改单个或多个Test_User对象
           /// </summary>
           /// <param name="model">修改的对象</param>
           /// <param name="where">查询需要修改的对象条件</param>
           /// <returns>sql操作的影响行数</returns>
           public int UpdateModel(Test_User model,string where)
           {
               using (SqlConnection conn = new SqlConnection(DbHelperSQL.connectionString))
               {
                   var sql = new StringBuilder();
                   sql.Append(" update  Test_User set id=@id,user_name=@user_name,age=@age,sex=@sex,phone=@phone,address=@address,create_time=@create_time,update_time=@update_time  where 1=1 ");
                   if (!string.IsNullOrWhiteSpace(where))
                       sql.Append(where);
                   return conn.Execute(sql.ToString(),new{user_name=model.user_name,age=model.age,sex=model.sex,phone=model.phone,address=model.address,create_time=model.create_time,update_time=model.update_time});
               }
           }
    
           /// <summary>
           /// 获取单个Test_User对象
           /// </summary>
           /// <param name="columnHead">显示列头</param>
           /// <param name="where">查询条件</param>
           /// <param name="order">排序条件</param>
           /// <returns>Test_User对象</returns>
           public  Test_User GetModel(string columnHead, string where, string order)
           {
               using (SqlConnection conn = new SqlConnection(DbHelperSQL.connectionString))
               {
                   var sql = new StringBuilder(); 
                   sql.Append(" select "); 
                   sql.Append(string.IsNullOrWhiteSpace(columnHead)?" * " : columnHead); 
                   sql.Append(" from  Test_User  where 1=1 "); 
                   if (!string.IsNullOrWhiteSpace(where)) 
                       sql.Append(where); 
                       sql.Append(string.IsNullOrWhiteSpace(order)?" order by id  " : order); 
                       return conn.QueryFirstOrDefault<Test_User>(sql.ToString()); 
                 } 
           }
    
           /// <summary>
           ///  获取多个Test_User对象
           /// </summary>
           /// <param name="columnHead">显示列头</param>
           /// <param name="where">查询条件</param>
           /// <param name="order">排序条件</param>
           /// <returns>List<Test_User>对象</returns>
           public  List<Test_User> GetModelList(string columnHead, string where, string order)
           {
               using (SqlConnection conn = new SqlConnection(DbHelperSQL.connectionString))
               {
                   var sql = new StringBuilder();
                   sql.Append(" select ");
                   sql.Append(string.IsNullOrWhiteSpace(columnHead)?" * " : columnHead); 
                   sql.Append(" from  Test_User  where 1=1 ");
                   if (!string.IsNullOrWhiteSpace(where))
                       sql.Append(where);
                   sql.Append(string.IsNullOrWhiteSpace(order)?" order by id  " : order); 
                   return conn.Query<Test_User>(sql.ToString()).ToList(); 
               }
           }
    
       }
    }
    Test_UserRepository

      添加Log4Net

     

      webApi项目下新建log4net.config ,并在Global.asax 中添加初始化配置的方法。

      注:此处测试Log4Net 不区分Mvc和和ApiController,都可以使用

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
      </configSections>
      <log4net>
        <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
        <!-- Set root logger level to ERROR and its appenders -->
        <root>
          <level value="ALL" />
          <appender-ref ref="SysAppender" />
        </root>
        <!-- Print only messages of level DEBUG or above in the packages -->
        <logger name="WebLogger">
          <level value="DEBUG" />
        </logger>
        <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
          <!--log存在地址-->
          <param name="File" value="App_Data/" />
          <param name="AppendToFile" value="true" />
          <param name="RollingStyle" value="Date" />
          <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
          <param name="StaticLogFileName" value="false" />
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
          </layout>
        </appender>
        <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
          <layout type="log4net.Layout.PatternLayout,log4net">
            <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
          </layout>
        </appender>
      </log4net>
    </configuration>
    log4net.config
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Web;
    using System.Web.Http;
    using System.Web.Mvc;
    using System.Web.Optimization;
    using System.Web.Routing; 
    
    namespace OZYShopWebApi
    {
        public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
    
                //注册log4net,配置从log4net.config中读取
                log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("~/log4net.config")));
    
                AreaRegistration.RegisterAllAreas();
                GlobalConfiguration.Configure(WebApiConfig.Register);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
            }
    
    
            //抓取全局错误
            protected void Application_Error(Object sender, EventArgs e)
            {
                //在出现未处理的错误时运行的代码         
                Exception objError = Server.GetLastError().GetBaseException();
    
                lock (this)
                {
                    //判断是否要创建SystemLog文件
                    var filePath = AppDomain.CurrentDomain.BaseDirectory + @"SystemLog";
                    if (!Directory.Exists(filePath))
                        Directory.CreateDirectory(filePath);
                    //判断是否要创建txt
                    var path = HttpContext.Current.Server.MapPath(@"/SystemLog/" + DateTime.Now.ToString("yyyy-MM-dd") + "错误日志.txt");
                    if (!File.Exists(path))
                        File.Create(path).Close();
                    using (StreamWriter w = File.AppendText(path))
                    {
                        w.WriteLine("
    系统发生错误: ");
                        w.WriteLine("发生时间:{0}", DateTime.Now);
                        w.WriteLine("发生异常页:{0}", HttpContext.Current.Request.Url.ToString());
                        w.WriteLine("发生错误的类名:{0}", objError.TargetSite.DeclaringType.FullName);
                        w.WriteLine("发生错误的方法名:{0}", objError.TargetSite.Name);
                        w.WriteLine("异常信息:{0}", objError.Message);
                        w.WriteLine("错误源:{0}", objError.Source);
                        w.WriteLine("堆栈信息:{0}", objError.StackTrace);
                        w.WriteLine("________________________________________________________");
                        w.Flush();
                        w.Close();
                    }
                }
                //清除当前异常 使之不返回到请求页面
                Server.ClearError();
                Response.Write("程序出现异常状态,请联系管理员");
            }
        }
    }
    Global.asax
    using log4net;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Utility.log;
    
    namespace TestDapper.Controllers
    {
        public class HomeController : Controller
        {
            //声明log接口 ; System.Reflection.MethodBase.GetCurrentMethod().DeclaringType 当前类名
            private readonly ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
            public ActionResult Index()
            {
                //log4net写入日志
                log.Info("123");
                log.Error("123");
                log.Fatal("123");
                log.Debug("123");
                log.Warn("123");
                //自定义写入日志
                WriteLogConfig.WriteLogInfo("TestSystem", "aaa", "Test", "123");
                ViewBag.Title = "Home Page";
    
                return View();
            }
        }
    }
    HomeController.cs

       测试依赖注入

      

      

      注:WebApid的请求路由和Mvc的不一样,若需更改。请进入App_Start=>打开WebApiConfig.cs

    //旧
    config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );

      更改路由模板

    config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }//若需设置默认路径请参考App_Start=>RouteConfig.cs
                );
    

      

    using Repository.IRepositories;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    
    namespace TestDapper.Controllers
    {
        public class DefaultController : ApiController
        {
            //声明
            private readonly  ITest_UserRepository itur;
            //创建有参的构造函数
            public DefaultController(ITest_UserRepository itur)
            {
                this.itur = itur;
            }
    
            public string GetNum() {
    
                return       "123";
            }
        }
    }
    DefaultController.cs

      设置Cors跨域,需要引用 Microsoft.AspNet.Cors v5.2.7 和 Microsoft.AspNet.WebApi.Cors v5.2.7 插件,同时新增Cors自定义配置。如何添加扩展插件,我就不截图了,手酸了。。。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Web.Http;
    using Microsoft.Owin.Security.OAuth;
    using Newtonsoft.Json.Serialization;
    using System.Configuration;
    using System.Web.Http.Cors;
    
    namespace OZYShopWebApi
    {
        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
    
    
                //跨域配置
                var cors = new EnableCorsAttribute(ConfigurationManager.AppSettings["Origins"], "*", "*");
                config.EnableCors(cors);
    
                // Web API 配置和服务
                // 将 Web API 配置为仅使用不记名令牌身份验证。
                config.SuppressDefaultHostAuthentication();
                config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
    
    
    
                // Web API 路由
                config.MapHttpAttributeRoutes();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{action}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            }
        }
    }
    WebApiConfig

      

       测试方法很简单,将代码发布本地IIS绑定端口,然后本地代码请求绑定的端口上的控制器方法就可以看效果了,F12可查看错误。

     以上都是个人陋闻,如有问题有劳指正,大家共同学习共同进步。如果有帮助到您,希望您能给动个小手点一下右下方的推荐,谢谢。

  • 相关阅读:
    SQL语句执行效率及分析(note)
    双重检查锁定及单例模式
    可定制生命周期的缓存
    php CI框架高级视图功能,视图继承,多重继承,视图片段
    php 使用pdo连接postgresql
    python 学习整理
    phpmailer 发送邮件
    php syslog记录系统日志
    php 学习整理
    php 生成唯一id方法
  • 原文地址:https://www.cnblogs.com/yuqiuyeyun/p/11378057.html
Copyright © 2011-2022 走看看