FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 7797|回复: 12
打印 上一主题 下一主题

NO 持久层,No SQL,最简单的全自动sql封装类,欢大家讨论

[复制链接]
跳转到指定楼层
楼主
发表于 2013-10-13 16:08:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yimi00 于 2013-10-13 16:12 编辑

三石先生实现了 No JavaScript,No CSS,No UpdatePanel,No ViewState,No WebServices
我看看能不能实现NO SQL(目前已经有很多持久层的框架了,而且都很成熟,本文只是作为简单的想法,希望用简单的方法实现持久层,本人很菜鸟,所以想法很简单)
一些思路
通过VS插件自动化封装数据库表实体类,
实体类实例化后,直接提交到封装类中,数据库直接识别实体类封装对应的SQL语句
使用过程中,只使用到一 个model类和sqlBase类,sqlBase类代码很少,便于扩展。
下面贴出代码,希望大家参与探讨,在博客中有详细的过程讲解,大家可以参考一下
http://blog.csdn.net/gbk8290/article/details/12679015

如操作model_order实体(自动化实体类生成工具我已经开发出来,需要的同志留言,可以全自动生成模型类)
model_order order=new model_order();
order.xxx="";
......
sqlBase sql=new sqlBase();
增加:sql.ExecuteInsert(order);
修改:sql.ExecuteUpdate(order,"id=5");
删除:sql.ExecuteDelete(order);
查询:sql.ExecuteSelect(order);


public class SqlBase
    {
       /// <summary>
       /// 根据实体模型对象自动封装Update的语句并执行,返回受影响行数
       /// </summary>
       /// <param name="obj">表模型对象</param>
       /// <param name="args">where后面的条件,格式为:id=15</param>
       /// <returns></returns>
       public string ExecuteUpdate(object obj, params string[] args)
       {
           string condetion = "";
           for (int i = 0; i < args.Length; i++)
           {
               condetion += args + " and ";
           }
           condetion = condetion.Substring(0, condetion.Length - 6);
           Type t = obj.GetType();
           string[] arg = t.Name.Split('_');
           string TableName = arg[1];
           string vas = "";
           string sql = "update {0} set {1} where {2}";
           PropertyInfo[] pinfo = t.GetProperties();
           foreach (PropertyInfo p in pinfo)
           {
               if (p.GetValue(obj, null) != null)
               {
                   vas += p.Name + "=" + "'" + p.GetValue(obj).ToString() + "',";
               }
           }
           vas = vas.Substring(0, vas.Length - 1);
           sql = string.Format(sql, TableName, vas, condetion);
           ///执行SQL语句,返回影响数
           ///在这里可以直接调用数据库操作类进行SQL操作,根据操作结果修改返回值类型,这里返回sql字符串仅仅作为演示用
           return sql;
       }
       /// <summary>
       /// obj为需要操作的数据库模型类,自动封装
       /// </summary>
       /// <param name="obj">为需要操作的数据库模型类</param>
       /// <returns></returns>
       public string ExecuteInsert(object obj)
       {
           Type t = obj.GetType();
           string[] arg = t.Name.Split('_');
           string TableName = arg[1];
           string coluns = "";
           string vas = "";
           string sql = "insert into {0}({1}) values ({2})";
           PropertyInfo[] pinfo = t.GetProperties();
           foreach (PropertyInfo p in pinfo)
           {
               if (p.GetValue(obj, null) != null)
               {
                   coluns += p.Name + ",";
                   vas += "'" + p.GetValue(obj).ToString() + "',";
               }
           }
           coluns = coluns.Substring(0, coluns.Length - 1);
           vas = vas.Substring(0, vas.Length - 1);
           ///取得已经封装好的SQL语句
           sql = string.Format(sql, TableName, coluns, vas);
           return sql;
       }
       /// <summary>
       /// 对传递的实体类进行删除操作,实体类中要对筛选的列进行赋值
       /// </summary>
       /// <param name="obj">需要操作的实体类</param>
       /// <returns></returns>
       public string ExecuteDel(object obj)
       {
           Type t = obj.GetType();
           string[] arg = t.Name.Split('_');
           string TableName = arg[1];
           string condetion = "";
           string sql = "delete from {0} where {1}";
           PropertyInfo[] pinfo = t.GetProperties();
           foreach (PropertyInfo p in pinfo)
           {
               if (p.GetValue(obj, null) != null)
               {
                   condetion += p.Name + "='" + p.GetValue(obj).ToString()+"' and ";
               }
           }
           condetion = condetion.Substring(0,condetion.Length-5);
           sql = string.Format(sql, TableName, condetion);
           ///返回受影响行数
           return sql;
       }
       /// <summary>
       /// 对传递的实体类进行查询,查询的条件直接在实体类中进行赋值,目前只返回全部列,目前只支持一般条件查询,like,between之类的查询需要自己扩展
       /// </summary>
       /// <param name="obj"></param>
       /// <returns></returns>
       public string ExecuteSelect(object obj)
       {
           Type t = obj.GetType();
           string[] arg = t.Name.Split('_');
           string TableName = arg[1];
           string condetion = "";
           string sql = "select from {0} where {1}";
           PropertyInfo[] pinfo = t.GetProperties();
           foreach (PropertyInfo p in pinfo)
           {
               if (p.GetValue(obj, null) != null)
               {
                   condetion += p.Name + "='" + p.GetValue(obj).ToString() + "' and ";
               }
           }
           ///不设置条件返回所有行
           if (condetion == "")
           {
               sql =string.Format("select from {0}",TableName);
           }
           else {
               condetion = condetion.Substring(0, condetion.Length - 5);
               sql = string.Format(sql, TableName,condetion);
           }
           return sql;
       }
    }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
沙发
发表于 2013-10-14 09:49:53 | 只看该作者
看来很多人都在折腾这个东西啊
  1.    
  2. public interface IObjectSet<T> where T : new()
  3.     {
  4.         void CreateTable();

  5.         /// <summary>
  6.         /// 保存一个实体
  7.         /// </summary>
  8.         /// <param name="entity"></param>
  9.         /// <returns></returns>
  10.         int Create(T entity);

  11.         /// <summary>
  12.         /// 批量保存实体
  13.         /// </summary>
  14.         /// <param name="list"></param>
  15.         /// <returns></returns>
  16.         int Create(IList<T> list);

  17.         /// <summary>
  18.         /// 更新实体,暂定为更新所有字段
  19.         /// </summary>
  20.         /// <param name="entity"></param>
  21.         /// <returns></returns>
  22.         int Update(T entity);

  23.         T Read(int val);

  24.         /// <summary>
  25.         /// 按条件读取一个数据
  26.         /// </summary>
  27.         /// <param name="where"> and xxx=xxx</param>
  28.         /// <returns></returns>
  29.         T Read(string where);

  30.         /// <summary>
  31.         /// 带排序方向的读取
  32.         /// </summary>
  33.         /// <param name="where"></param>
  34.         /// <param name="orderBy"></param>
  35.         /// <returns></returns>
  36.         T Read(string where,string orderBy);

  37.         /// <summary>
  38.         /// 以主键值删除
  39.         /// </summary>
  40.         /// <param name="val">主键值</param>
  41.         /// <returns></returns>
  42.         int Delete(int val);

  43.         /// <summary>
  44.         /// 以条件删除
  45.         /// </summary>
  46.         /// <param name="where">条件T-SQL and xxx=xxx</param>
  47.         /// <returns></returns>
  48.         int Delete(string where);

  49.         /// <summary>
  50.         /// 以实体为依据删除
  51.         /// </summary>
  52.         /// <param name="entity"></param>
  53.         /// <returns></returns>
  54.         int Delete(T entity);

  55.         /// <summary>
  56.         /// 批量删除
  57.         /// </summary>
  58.         /// <param name="list"></param>
  59.         /// <returns></returns>
  60.         int Delete(IList<T> list);

  61.         /// <summary>
  62.         /// 获取记录总数
  63.         /// </summary>
  64.         int GetTotal(string strWhere);

  65.         /// <summary>
  66.         /// 执行自由的T-SQL脚本返回DataTable
  67.         /// </summary>
  68.         /// <param name="sqlCommand"></param>
  69.         /// <returns></returns>
  70.         DataTable FreeDataTable(string sqlCommand);
  71.         DataSet FreeDataSet(string sqlCommand);
  72.         /// <summary>
  73.         /// 查询获得DataTable
  74.         /// </summary>
  75.         /// <returns></returns>
  76.         DataTable GetTable();
  77.         DataTable GetTable(string @where);
  78.         DataTable GetTable(int count, string @where);
  79.         DataTable GetTable(int count, string @where, string orderBy);
  80.         /// <summary>
  81.         /// 根据条件,排序规则返回分页数据列表
  82.         /// </summary>
  83.         /// <param name="page"></param>
  84.         /// <param name="pageSize"></param>
  85.         /// <param name="where"></param>
  86.         /// <param name="orderBy"></param>
  87.         /// <param name="recordCount"></param>
  88.         /// <returns></returns>
  89.         DataTable GetTable(int page, int pageSize, string @where, string orderBy, out int recordCount);
  90.         /// <summary>
  91.         /// 查询获得IList
  92.         /// </summary>
  93.         /// <returns></returns>
  94.         IList<T> GetList();
  95.         IList<T> GetList(string @where);
  96.         IList<T> GetList(int count, string @where);
  97.         IList<T> GetList(int count, string @where, string orderBy);

  98.         /// <summary>
  99.         /// 根据条件,排序规则返回分页数据列表
  100.         /// </summary>
  101.         /// <param name="page"></param>
  102.         /// <param name="pageSize"></param>
  103.         /// <param name="where"></param>
  104.         /// <param name="orderBy"></param>
  105.         /// <param name="recordCount"></param>
  106.         /// <returns></returns>
  107.         IList<T> GetList(int page, int pageSize, string @where, string orderBy, out int recordCount);

  108.         /// <summary>
  109.         /// 根据完整的T-SQL返回分页列表,用于联合查询类的SQL
  110.         /// </summary>
  111.         /// <param name="page"></param>
  112.         /// <param name="pageSize"> </param>
  113.         /// <param name="sql"></param>
  114.         /// <param name="recordCount"></param>
  115.         /// <returns></returns>
  116.         IList<T> GetList(int page, int pageSize, string sql, out int recordCount);
  117.     }
复制代码
板凳
发表于 2013-10-14 10:11:28 | 只看该作者
没必要吧。微软的EF不是挺好嘛?何必浪费时间去做前人已经做过的事情呢。这种只要学习使用就可以了。
地板
发表于 2013-10-14 11:00:38 | 只看该作者
有点意思,看看!
5#
 楼主| 发表于 2013-10-14 17:22:51 | 只看该作者
◆◇_提拉米苏℡ 发表于 2013-10-14 10:11
没必要吧。微软的EF不是挺好嘛?何必浪费时间去做前人已经做过的事情呢。这种只要学习使用就可以了。 ...

微软的ef确实强大,网络上面也有很多成熟的框架,但是越是成熟的功能完整的东西都比较复杂,如果能有一套简单的,一百几十行代码能满足小型系统的,我觉得可以大家可以考虑更灵活更简单的东西
6#
发表于 2013-10-15 10:16:30 | 只看该作者
自从2010发布后,就没怎么学习过新加的东西了,关于EF,linq啥的一点都不懂,不过博主的封装本省过程就是个学习的过程,但是斗胆说下,你的代码分装真是问题多多。
7#
发表于 2013-10-15 10:45:13 | 只看该作者
哈哈。我也是的,我从VB6.0,就开始搞开发设计了,用惯了SQL,特别现在就喜欢用三层结构,LINQ知道简单,快捷,但在很多关联表中用的不太方便。
8#
发表于 2013-10-15 10:51:05 | 只看该作者
用这种SQL拼接,安全性是个问题。
9#
 楼主| 发表于 2013-10-15 19:07:27 | 只看该作者
吉吉﹑ 发表于 2013-10-15 10:51
用这种SQL拼接,安全性是个问题。

安全性体现在哪里?不好意思,我是新手来的,代码经验欠缺,特别请教。
10#
 楼主| 发表于 2013-10-15 19:09:33 | 只看该作者
现在一直在使用中,发现还是比较方便的,数据库修改,代码就提示被改的地方,出错率很低。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-11-27 20:31 , Processed in 0.048877 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表