SQLServer数据库之WangSql -- SqlExe 一个操作数据库的简单框架
小标 2018-09-07 来源 : 阅读 1205 评论 0

摘要:本文主要向大家介绍了SQLServer数据库之WangSql -- SqlExe 一个操作数据库的简单框架,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。

本文主要向大家介绍了SQLServer数据库之WangSql -- SqlExe 一个操作数据库的简单框架,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。

这只是开篇,会持续更新。
目前用到反射较多,影响性能啊,后期考虑用映射,不过映射恐怕又要写配置文件,麻烦啊。
1.项目结构
目前支持 SqlServer Access Oracle MySql 要支持其他数据库可以自己添加。
2.功能详解
 2.1 database.config
将database.config放到网站根目录,名字不可改。

 SqlExeString:表示数据库连接字符串
 DatabaseType:表示数据库类型。目前支持(SqlServer,Access,Oracle,MySql)
 2.2 ISqlExe(接口类)
SqlExe是WangSql最核心的部分,而ISqlExe是SqlExe的接口类。
ISqlExe提供了所有方法的接口,定义如下:

    public interface ISqlExe
    {
        #region 执行事务
        /// 


        /// 执行事务
        /// 


        bool Transaction(Hashtable sqlList);
        #endregion

        #region sql执行过程 增删改
        /// 


        /// NonQuery 无参
        /// 


        int NonQuery(string sql);
        /// 


        /// NonQuery 有参
        /// 


        int NonQuery(string sql, object para);
        #endregion

        #region sql执行过程 查询

        #region 无参
        /// 


        /// Query 无参
        /// 


        DataTable Query(string sql);
        /// 


        /// QueryObject 无参
        /// 


        T QueryObject

(string sql);
        /// 
        /// QueryModel 无参
        /// 

        T QueryModel(string sql) where T : new();
        /// 
        /// QueryList 无参
        /// 

        List QueryList(string sql) where T : new();
        #endregion


        #region 有参
        /// 
        /// Query 有参
        /// 

        DataTable Query(string sql, object para);
        /// 
        /// QueryObject 有参
        /// 

        T QueryObject(string sql, object para);
        /// 
        /// QueryModel 有参
        /// 

        T QueryModel(string sql, object para) where T : new();
        /// 
        /// QueryList 有参
        /// 

        List QueryList(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(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(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 QueryList(string sql) where T : new()
        {
            List tList;
            DataTable dt = BaseQuery(sql);
            if (dt != null && dt.Rows.Count > 0)
            {
                tList = new List();
                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();
            }
            return tList;
        }
        #endregion


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

        public T QueryObject(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(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 QueryList(string sql, object para) where T : new()
        {
            List tList;
            DataTable dt = BaseQuery(sql, para);
            if (dt != null && dt.Rows.Count > 0)
            {
                tList = new List();
                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();
            }
            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 paraName = new List();
                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 paraName = new List();
                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 paraName = new List();
                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语句例子

/// 
        /// 用户新增
        /// 

        public const string UserInsert = "insert into [User](UserName,Password) values(#UserName#,#Password#)";


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

        public static string SqlInit(string sql, out List paraName)
        {
            string sqlTag = sql;
            List sqlParaName = new List();
            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;
        }

    目前这方法是有点问题,可以自己修改。
 
未完待续...

以上就介绍了SQL Server的相关知识,希望对SQL Server有兴趣的朋友有所帮助。了解更多内容,请关注职坐标数据库SQL Server频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程