FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

搜索
查看: 7531|回复: 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
13#
发表于 2013-10-16 14:15:08 | 只看该作者
yimi00 发表于 2013-10-15 19:07
安全性体现在哪里?不好意思,我是新手来的,代码经验欠缺,特别请教。 ...

最好是字段是参数化
12#
发表于 2013-10-16 10:17:45 | 只看该作者
yimi00 发表于 2013-10-14 17:22
微软的ef确实强大,网络上面也有很多成熟的框架,但是越是成熟的功能完整的东西都比较复杂,如果能有一套 ...

呵呵,个人见解不同吧。有的人觉得复杂,有的人则认为功能全。都是看个人理解吧。你可以看下老大的博文,跟着老大一起学习code first。应该还算简单吧
11#
发表于 2013-10-15 21:40:34 | 只看该作者
要防注入神马的,要考虑批量执行、事务神马的。
10#
 楼主| 发表于 2013-10-15 19:09:33 | 只看该作者
现在一直在使用中,发现还是比较方便的,数据库修改,代码就提示被改的地方,出错率很低。
9#
 楼主| 发表于 2013-10-15 19:07:27 | 只看该作者
吉吉﹑ 发表于 2013-10-15 10:51
用这种SQL拼接,安全性是个问题。

安全性体现在哪里?不好意思,我是新手来的,代码经验欠缺,特别请教。
8#
发表于 2013-10-15 10:51:05 | 只看该作者
用这种SQL拼接,安全性是个问题。
7#
发表于 2013-10-15 10:45:13 | 只看该作者
哈哈。我也是的,我从VB6.0,就开始搞开发设计了,用惯了SQL,特别现在就喜欢用三层结构,LINQ知道简单,快捷,但在很多关联表中用的不太方便。
6#
发表于 2013-10-15 10:16:30 | 只看该作者
自从2010发布后,就没怎么学习过新加的东西了,关于EF,linq啥的一点都不懂,不过博主的封装本省过程就是个学习的过程,但是斗胆说下,你的代码分装真是问题多多。
5#
 楼主| 发表于 2013-10-14 17:22:51 | 只看该作者
◆◇_提拉米苏℡ 发表于 2013-10-14 10:11
没必要吧。微软的EF不是挺好嘛?何必浪费时间去做前人已经做过的事情呢。这种只要学习使用就可以了。 ...

微软的ef确实强大,网络上面也有很多成熟的框架,但是越是成熟的功能完整的东西都比较复杂,如果能有一套简单的,一百几十行代码能满足小型系统的,我觉得可以大家可以考虑更灵活更简单的东西
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-21 03:36 , Processed in 0.048788 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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