当前位置:Gxlcms > 数据库问题 > WangSql -- SqlExe 一个操作数据库的简单框架

WangSql -- SqlExe 一个操作数据库的简单框架

时间:2021-07-01 10:21:17 帮助过:4人阅读

技术分享

目前支持 SqlServer Access Oracle MySql 要支持其他数据库可以自己添加。

2.功能详解

 2.1 database.config

将database.config放到网站根目录,名字不可改。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="SqlExeString" value="data source=wc\sqlexpress;database=441314;uid=sa;pwd=123456;"/>
    <add key="DatabaseType" value="SqlServer"/>
  </appSettings>
</configuration>

 SqlExeString:表示数据库连接字符串

 DatabaseType:表示数据库类型。目前支持(SqlServer,Access,Oracle,MySql)

 2.2 ISqlExe(接口类)

SqlExe是WangSql最核心的部分,而ISqlExe是SqlExe的接口类。

ISqlExe提供了所有方法的接口,定义如下:

    public interface ISqlExe
    {
        #region 执行事务
        /// <summary>
        /// 执行事务
        /// </summary>
        bool Transaction(Hashtable sqlList);
        #endregion

        #region sql执行过程 增删改
        /// <summary>
        /// NonQuery 无参
        /// </summary>
        int NonQuery(string sql);
        /// <summary>
        /// NonQuery 有参
        /// </summary>
        int NonQuery(string sql, object para);
        #endregion

        #region sql执行过程 查询

        #region 无参
        /// <summary>
        /// Query 无参
        /// </summary>
        DataTable Query(string sql);
        /// <summary>
        /// QueryObject 无参
        /// </summary>
        T QueryObject<T>(string sql);
        /// <summary>
        /// QueryModel 无参
        /// </summary>
        T QueryModel<T>(string sql) where T : new();
        /// <summary>
        /// QueryList 无参
        /// </summary>
        List<T> QueryList<T>(string sql) where T : new();
        #endregion


        #region 有参
        /// <summary>
        /// Query 有参
        /// </summary>
        DataTable Query(string sql, object para);
        /// <summary>
        /// QueryObject 有参
        /// </summary>
        T QueryObject<T>(string sql, object para);
        /// <summary>
        /// QueryModel 有参
        /// </summary>
        T QueryModel<T>(string sql, object para) where T : new();
        /// <summary>
        /// QueryList 有参
        /// </summary>
        List<T> QueryList<T>(string sql, object para) where T : new();
        #endregion

        #endregion
    }

 

 2.3 SqlExe实现方法

 在文件夹Sql.SqlServer下所有的类都是为了实现ISqlExe的方法。

 根据文件名就可以知道这里是SqlServer数据库的实现方法。

 为了方面后续开发和管理,将SqlExe用部分类组合而成。每一部分处理各种不同的数据操作。

技术分享

 打开所有SqlExe.*.cs文件观察,不难发现命名空间是WangSql.SqlServer且所有类都是SqlExe(partial)继承自ISqlExe

 来看看其中SqlExe.Query.cs的实现方法,听名字就知道只要是用来做查询操作的部分了。注释写的少了,抱歉。。。

    public partial class SqlExe : ISqlExe
    {

        #region sql执行过程 查询

        #region 无参
        public DataTable Query(string sql)
        {
            DataTable dt = BaseQuery(sql);
            return dt;
        }

        public T QueryObject<T>(string sql)
        {
            T t;
            DataTable dt = BaseQuery(sql);
            if (dt != null && dt.Rows.Count > 0)
            {
                object result = dt.Rows[0][0];
                t = (T)result;
            }
            else
            {
                t = default(T);
            }
            return t;
        }

        public T QueryModel<T>(string sql) where T : new()
        {
            T t;
            DataTable dt = BaseQuery(sql);
            if (dt != null && dt.Rows.Count > 0)
            {
                t = new T();
                DataRow dr = dt.Rows[0];
                PropertyInfo[] propertys = t.GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    string tempName = pi.Name;
                    if (dt.Columns.Contains(tempName))
                    {
                        if (!pi.CanWrite) continue;
                        object value = dr[tempName];
                        if (value != DBNull.Value)
                            pi.SetValue(t, value, null);
                    }
                }
            }
            else
            {
                t = default(T);
            }
            return t;
        }

        public List<T> QueryList<T>(string sql) where T : new()
        {
            List<T> tList;
            DataTable dt = BaseQuery(sql);
            if (dt != null && dt.Rows.Count > 0)
            {
                tList = new List<T>();
                foreach (DataRow dr in dt.Rows)
                {
                    T t = new T();
                    PropertyInfo[] propertys = t.GetType().GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        string tempName = pi.Name;
                        if (dt.Columns.Contains(tempName))
                        {
                            if (!pi.CanWrite) continue;
                            object value = dr[tempName];
                            if (value != DBNull.Value)
                                pi.SetValue(t, value, null);
                        }
                    }
                    tList.Add(t);
                }
            }
            else
            {
                tList = new List<T>();
            }
            return tList;
        }
        #endregion


        #region 有参
        public DataTable Query(string sql, object para)
        {
            DataTable dt = BaseQuery(sql, para);
            return dt;
        }

        public T QueryObject<T>(string sql, object para)
        {
            T t;
            DataTable dt = BaseQuery(sql, para);
            if (dt != null && dt.Rows.Count > 0)
            {
                object result = dt.Rows[0][0];
                t = (T)result;
            }
            else
            {
                t = default(T);
            }
            return t;
        }

        public T QueryModel<T>(string sql, object para) where T : new()
        {
            T t;
            DataTable dt = BaseQuery(sql, para);
            if (dt != null && dt.Rows.Count > 0)
            {
                t = new T();
                DataRow dr = dt.Rows[0];
                PropertyInfo[] propertys = t.GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    string tempName = pi.Name;
                    if (dt.Columns.Contains(tempName))
                    {
                        if (!pi.CanWrite) continue;
                        object value = dr[tempName];
                        if (value != DBNull.Value)
                            pi.SetValue(t, value, null);
                    }
                }
            }
            else
            {
                t = default(T);
            }
            return t;
        }

        public List<T> QueryList<T>(string sql, object para) where T : new()
        {
            List<T> tList;
            DataTable dt = BaseQuery(sql, para);
            if (dt != null && dt.Rows.Count > 0)
            {
                tList = new List<T>();
                foreach (DataRow dr in dt.Rows)
                {
                    T t = new T();
                    PropertyInfo[] propertys = t.GetType().GetProperties();
                    foreach (PropertyInfo pi in propertys)
                    {
                        string tempName = pi.Name;
                        if (dt.Columns.Contains(tempName))
                        {
                            if (!pi.CanWrite) continue;
                            object value = dr[tempName];
                            if (value != DBNull.Value)
                                pi.SetValue(t, value, null);
                        }
                    }
                    tList.Add(t);
                }
            }
            else
            {
                tList = new List<T>();
            }
            return tList;
        }
        #endregion








        #region 查询基方法
        private DataTable BaseQuery(string sql)
        {
            var result = helper.ExecuteReader(sql);
            return result;
        }
        private DataTable BaseQuery(string sql, object para)
        {
            Hashtable ht = null;
            string typeName = para.GetType().FullName;
            if (ToWhat.IsModel(typeName))//Model入参
            {
                ht = ToWhat.ModelToHashtable(para);

                List<string> paraName = new List<string>();
                string sqlTag = ToWhat.SqlInit(sql, out paraName);

                SqlParameter[] sqlParas = new SqlParameter[paraName.Count];
                for (int i = 0; i < paraName.Count; i++)
                {
                    string key = paraName[i];
                    object value = ht[key];
                    sqlParas[i] = new SqlParameter("@" + key, value);
                }
                var result = helper.ExecuteReader(sqlTag, sqlParas);
                return result;
            }
            else if (typeName.Contains("Hashtable"))//Hashtanle入参
            {
                ht = (Hashtable)para;

                List<string> paraName = new List<string>();
                string sqlTag = ToWhat.SqlInit(sql, out paraName);

                SqlParameter[] sqlParas = new SqlParameter[paraName.Count];
                for (int i = 0; i < paraName.Count; i++)
                {
                    string key = paraName[i];
                    object value = ht[key];
                    sqlParas[i] = new SqlParameter("@" + key, value);
                }
                var result = helper.ExecuteReader(sqlTag, sqlParas);
                return result;
            }
            else//一个参数入参
            {
                List<string> paraName = new List<string>();
                string sqlTag = ToWhat.SqlInit(sql, out paraName);
                SqlParameter[] sqlParas = new SqlParameter[paraName.Count];
                for (int i = 0; i < paraName.Count; i++)
                {
                    string key = paraName[i];
                    object value = para;
                    sqlParas[i] = new SqlParameter("@" + key, value);
                }
                var result = helper.ExecuteReader(sqlTag, sqlParas);
                return result;
            }
        }
        #endregion
        #endregion

    }

 

  2.3 ToWhat.cs

  里面有一些公用的方法,下面详细讲讲其中SqlInit和IsModel方法

  主要是在上面也用到了这两个方法。

  2.3.1 SqlInit

    用来初始化sql语句的,在WangSql里面写SQL语句是有规范的,不过也和平时写的差不多。

    SQL语句例子

/// <summary>
        /// 用户新增
        /// </summary>
        public const string UserInsert = "insert into [User](UserName,Password) values(#UserName#,#Password#)";

参数用##包起来。

 SqlInit就是用来获取sql语句需要的参数名和初始化sql语句。

        public static string SqlInit(string sql, out List<string> paraName)
        {
            string sqlTag = sql;
            List<string> sqlParaName = new List<string>();
            Regex regex = new Regex("(#(.[^#]+)#)");
            var ms = regex.Matches(sql);
            foreach (Match item in ms)
            {
                var p1 = item.Groups[1];
                var p2 = item.Groups[2];
                sqlTag = sqlTag.Replace(p1.Value, "@" + p2.Value);
                sqlParaName.Add(p2.Value);
            }
            paraName = sqlParaName;
            return sqlTag;
        }

    2.3.1 IsModel

    这个方法用来判断传入的参数是否是系统参数还是我们自定义参数(Model)

        public static bool IsModel(string fullName)
        {
            ////自定义判断该object对象是否是Model对象
            ////例如Model全部放在Model下
            //if (fullName.Contains("Model")) return true;
            //else return false;
            if (fullName.StartsWith("System.")) return false;
            else return true;
        }

    目前这方法是有点问题,可以自己修改。

 

未完待续...

 

WangSql -- SqlExe 一个操作数据库的简单框架

标签:

人气教程排行