WangSql 1.0源码共享

一,项目背景

现在基本上大大小小的项目都需要和数据库打交道,自然而然数据库操作会有很多地方,而使用传统ADO.NET整个流程有点麻烦,出参都需要手动转换为对象。基于以上,我们需要一个SQL执行工具,能简化上诉步骤,而不失对SQL控制权。

二,核心技术

最底层是ADO.NET,基于ADO.NET开发的工具。

1、支持多数据库

2、支持增删改查事务过程等常用SQL操作

3、支持参数统一化

4、支持入参多样化,且自动转换成SQL参数

5、支持出参多样化,且自动转换成对象

6、缓存方案(未完成)

7、并发控制(未完成)

8、支持表达式组件(未完成)

三,功能详解

以下内容及源码都仅供参考,勿用于生成环境。

1、多数据支持&扩展

以SQLite为例

 1     public class SQLiteConn : ISqlConn
 2     {
 3         public SQLiteConn(string connectionString)
 4         {
 5             this.DbType = DbType.SQLITE;
 6             this.ConnectionString = connectionString;
 7         }
 8         public DbType DbType { get; set; }
 9         public string ConnectionString { get; set; }
10         public IDbConnection CreateDbConnection()
11         {
12             IDbConnection conn = new SQLiteConnection();
13             conn.ConnectionString = this.ConnectionString;
14             return conn;
15         }
16     }
 1     public class SQLiteFactory : SQLiteConn, IFactory
 2     {
 3         public SQLiteFactory(string connectionString)
 4             : base(connectionString)
 5         {
 6             this.DbDataParameterPrefix = "@";
 7         }
 8         public string DbDataParameterPrefix { get; set; }
 9         public IDbDataParameter CreateDbDataParameter(string key, object value)
10         {
11             return new SQLiteParameter(key, value);
12         }
13         public string CreatePageSql(string sqlTag, int pageIndex, int pageSize)
14         {
15             string para = null;
16             para = @"select wang.* from ({0}) wang limit {1},{2}";
17             para = string.Format(para, sqlTag, pageSize * (pageIndex - 1), pageSize);
18             return para;
19         }
20     }

目前支持Oracle,SqlServer,MySql,Access,SQLite数据库,如果要新增数据支持,只需实现ISqlConn和ISqlConn即可,具体实现同上。

2、具体测试&操作代码

 1             var sqlExe = new WangSql.SqlExe("SQLITE", conn);
 2
 3             Write("初始化SqlExe完成");
 4
 5             var site = new Site()
 6             {
 7                 Id = Guid.NewGuid().ToString("N"),
 8                 Name = "site1",
 9                 Domain = "www.baidu.com" + Guid.NewGuid().ToString("N"),
10                 Area = "web",
11                 Remark = "测试"
12             };
13
14             //insert
15             Write("insert开始");
16             string sqlInsert = "insert into Site(Id,Name,Domain,Area,Remark) values(#Id#,#Name#,#Domain#,#Area#,#Remark#)";
17             var resultInsert = sqlExe.NonQuery(sqlInsert, site);
18             Write("insert结束:结果:" + resultInsert);
19
20             //select
21             Write("select开始");
22             string sqlSelect = "select * from Site";
23             var resultSelect = sqlExe.QueryObject<Site>(sqlSelect);
24             var resultSelect1 = sqlExe.QueryList<Site>(sqlSelect);
25             int resultSelectIndex = new Random().Next(resultSelect1.Count);
26             Write("select结束:结果:" + resultSelect1[resultSelectIndex].Remark);
27
28             //update
29             Write("update开始");
30             string sqlUpdate = "update Site set Remark=#Remark# where Id=#Id#";
31             var site1 = new Site()
32             {
33                 Remark = "测试1",
34                 Id = resultSelect1[resultSelectIndex].Id
35             };
36             var resultUpdate = sqlExe.NonQuery(sqlUpdate, site1);
37             Write("update结束:结果:" + resultUpdate);
38
39             //Transaction
40             Write("trans开始");
41             using(var trans = sqlExe.BeginTransaction())
42             {
43                 string sqlTrans1 = "update Site set Remark=#Remark# where Id=#Id#";
44                 var site2 = new Site()
45                 {
46                     Remark = "测试2",
47                     Id = resultSelect1[resultSelectIndex].Id
48                 };
49                 var result1 = trans.NonQuery(sqlTrans1, site1);
50
51                 string sqlTrans2 = "update Site set Name=#Name# where Id=#Id#";
52                 var site3 = new Site()
53                 {
54                     Name = "SASASA3",
55                     Id = resultSelect1[resultSelectIndex].Id
56                 };
57                 var result2 = trans.NonQuery(sqlTrans2, site1);
58
59                 trans.Commit();
60             }
61             Write("trans结束");

3、具体使用&接口代码

3.1 创建核心操作类实例SqlExe

var sqlExe = new WangSql.SqlExe("SQLITE", conn);

第一参数是数据库类型,第二个参数是数据库连接字符串,返回ISqlExe接口对象实例。

3.2 ISqlExe最核心的类,提供了所有数据操作方法,所有操作都是调用该接口里的方法。

 1     public interface IMySqlExe
 2     {
 3         int ExecuteNonQuery(string sql);
 4         int ExecuteNonQuery(string sql, global::System.Data.IDbDataParameter par);
 5         int ExecuteNonQuery(string sql, global::System.Data.IDbDataParameter[] par);
 6         object ExecuteProcedure(string sql, global::System.Collections.Generic.Dictionary<string, object> inpara, ref global::System.Collections.Generic.Dictionary<string, object> outpara, global::WangSql.ExcuteType excuteType = ExcuteType.Query);
 7         object ExecuteProcedure(string sql, global::System.Collections.Generic.Dictionary<string, object> inpara, global::WangSql.ExcuteType excuteType = ExcuteType.Query);
 8         object ExecuteProcedure(string sql, global::WangSql.ExcuteType excuteType = ExcuteType.Query);
 9         global::System.Data.DataTable ExecuteReader(string sql);
10         global::System.Data.DataTable ExecuteReader(string sql, global::System.Data.IDataParameter par);
11         global::System.Data.DataTable ExecuteReader(string sql, global::System.Data.IDataParameter[] par);
12         int NonQuery(string sql);
13         int NonQuery(string sql, object para);
14         global::System.Collections.Generic.IList<T> QueryList<T>(string sql);
15         global::System.Collections.Generic.IList<T> QueryList<T>(string sql, object para);
16         T QueryObject<T>(string sql);
17         T QueryObject<T>(string sql, object para);
18         global::System.Data.DataTable QueryPage(string sql, int pageIndex, int pageSize, out int totalCount);
19         global::System.Data.DataTable QueryPage(string sql, object para, int pageIndex, int pageSize, out int totalCount);
20         global::System.Collections.Generic.IList<T> QueryPage<T>(string sql, int pageIndex, int pageSize, out int totalCount);
21         global::System.Collections.Generic.IList<T> QueryPage<T>(string sql, object para, int pageIndex, int pageSize, out int totalCount);
22         bool Transaction(global::System.Collections.Hashtable sqlList);
23     }

1     public interface ISqlExe : IMySqlExe
2     {
3         IMyTransaction BeginTransaction();
4     }

3.3 IMyTransaction是事务操作接口,在ISqlExe包含该对象。

 1     public interface IMyTransaction : IDisposable
 2     {
 3         void Commit();
 4         int NonQuery(string sql);
 5         int NonQuery(string sql, object para);
 6         System.Collections.Generic.IList<T> QueryList<T>(string sql);
 7         System.Collections.Generic.IList<T> QueryList<T>(string sql, object para);
 8         T QueryObject<T>(string sql);
 9         T QueryObject<T>(string sql, object para);
10         void Rollback();
11     }

4、SQL语句&事务使用说明

4.1 SQL语句

insert into Site(Id,Name,Domain,Area,Remark) values(#Id#,#Name#,#Domain#,#Area#,#Remark#)

上面就是一个完整的插入SQL语句,##这个就是最开始提到的支持参数统一化,所有参数都用##包裹,内部进行转换。

4.2 事务说明

            //Transaction
            Write("trans开始");
            using(var trans = sqlExe.BeginTransaction())
            {
                try
                {
                    string sqlTrans1 = "update Site set Remark=#Remark# where Id=#Id#";
                    var site2 = new Site()
                    {
                        Remark = "测试2",
                        Id = resultSelect1[resultSelectIndex].Id
                    };
                    var result1 = trans.NonQuery(sqlTrans1, site1);

                    string sqlTrans2 = "update Site set Name=#Name# where Id=#Id#";
                    var site3 = new Site()
                    {
                        Name = "SASASA3",
                        Id = resultSelect1[resultSelectIndex].Id
                    };
                    var result2 = trans.NonQuery(sqlTrans2, site1);

                    trans.Commit();
                }
                catch
                {
                    trans.Rollback();
                }
            }
            Write("trans结束");

四,总结

6、缓存方案(未完成)

7、并发控制(未完成)

8、支持表达式组件(未完成)

上面三个还没有完成的,对了,代码简单粗鄙,请勿用于生成环境,仅用于学习和交流。

五,源码下载

地址:源码下载

..................

..................

时间: 2024-12-28 23:53:27

WangSql 1.0源码共享的相关文章

WangSql 3.0源码共享(WangSql 1.0重大升级到3.0)

WangSql 1.0博文阅读: http://www.cnblogs.com/deeround/p/6204610.html 基于1.0做了以下重大改动: 1.多数据实现方式调整 2.使用EmitMapper代替反射实现DbDataReader转实体 3.源码在文章最后提供下载地址 核心功能介绍 多数据支持,采用配置文件形式实现多种数据实现,只需要指定数据库驱动即可实现所支持所有数据库任意切换. SQL自行管理,大大提高SQL可控性以及SQL性能优化. 高效实体转换,集成EmitMapper来

Tomcat7.0源码分析——启动与停止服务

前言 熟悉Tomcat的工程师们,肯定都知道Tomcat是如何启动与停止的.对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处理命令,大家一定知道改如何使用它,但是它们究竟是如何实现的,尤其是shutdown.sh脚本(或者shutdown.bat)究竟是如何和Tomcat进程通信的呢?本文将通过对Tomcat7.0的源码阅读,深入剖析这一过程. 由于在生产环境中,Tomcat一般部署在Linux系统下,所以本文将以startup.s

最近建了一个.net源码共享群,群共享有大量网友分享的.net(C#)商业源码

.net源码共享群 324087998. 本群创建于2013/6/21: 群里都是.net(C#)程序开发人员,群共享有大量网友分享的.net(C#)商业源码.比如:DTCMS旗舰版,hishop微分销,shopnum微分销,多用户微信公众平台开发,力软信息化快速开发框架.源码研究,源码共享,.net反编译破解,.net破解反编译,技术研究交流! 之前在CSDN上发了一下,现在群里有六七百人了.马上就满员了,第二个群又要开始了.群友都是很活跃的,现在群等级满级了. 这是之前文章内容: 由于工作需

云帆大数据学院_hadoop 2.2.0源码编译

2.1下载地址 1.ApacheHadoop(100%永久开源)下载地址: - http://hadoop.apache.org/releases.html - SVN:http://svn.apache.org/repos/asf/hadoop/common/branches/ 2.CDH(ClouderaDistributed Hadoop,100%永久开源)下载地址: - http://archive.cloudera.com/cdh4/cdh/4/(是tar.gz文件!) - http:

Tomcat7.0源码分析——启动与停止服务原理

前言 熟悉Tomcat的工程师们,肯定都知道Tomcat是如何启动与停止的.对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处理命令,大家一定知道改如何使用它,但是它们究竟是如何实现的,尤其是shutdown.sh脚本(或者shutdown.bat)究竟是如何和Tomcat进程通信的呢?本文将通过对Tomcat7.0的源码阅读,深入剖析这一过程. 由于在生产环境中,Tomcat一般部署在Linux系统下,所以本文将以startup.s

【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/51592930 手机的两种模式 : 在下面有详细的图片示例; -- Recovery 模式 : 音量键增加 + 电源键, 长按上述组合键, 看到 "MI" 的 LOGO 后即进入 Recovery 模式; -- Fastboot 模式 : 音量键减小 + 电源键, 长按上述组合键, 看到 "FASTBOOT" 后, 即 进入 FA

打造自己的视频会议系统 -- 原理篇 (附送GGMeeting 1.0 源码)

自从在博客园发布广域网即时通信系统GG(QQ高仿版)以来,结识了很多做IM的朋友,然后我和我的伙伴们也接到了很多与IM相关的项目.相比在发布GG之前难以接到项目的状况相比,现在简直太幸福了,虽然做项目很辛苦,但毕竟有钱赚,那辛苦也值了. 饮水思源,这里要感谢博客园提供了这么好的一个平台,让我们能展现自己的实力,提升我们的知名度,然后才能接到了更多项目.所以,我强烈建议那些希望接项目.接私单的朋友,都来博客园写博客吧,写出自己的知名度后,真是好处多多! 言归正传,前段时间做了个在线教育培训的项目,

Solr4.8.0源码分析(22)之 SolrCloud的Recovery策略(三)

Solr4.8.0源码分析(22)之 SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及PeerSync策略.本文以及后续的文章将重点介绍Replication策略.Replication策略不但可以在SolrCloud中起到leader到replica的数据同步,也可以在用多个单独的Solr来实现主从同步.本文先介绍在SolrCloud的leader到replica的数据同步,下一篇

Bootstrap 3.2.0 源码试读 2014/08/09

第一部分 normalize.css 104至110行 code,    /* 编辑代码 */ kbd,    /* 键盘输入的文本 */ pre, samp {    /* 范例,sample的简写 */   font-family: monospace, monospace;    /* 这个地方应该是写错了,第二字体应该是serif */   font-size: 1em; } 设置字体的大小为1em,字体为monospace. 111至119行 button, input, optgro