WangSql 1.0源码共享

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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结束");
View Code

 

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     }
View Code
技术分享
1     public interface ISqlExe : IMySqlExe
2     {
3         IMyTransaction BeginTransaction();
4     }
View Code

 

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     }
View Code

 

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、支持表达式组件(未完成)

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

五,源码下载

地址:源码下载

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

 技术分享

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

 

 

 

以上是关于WangSql 1.0源码共享的主要内容,如果未能解决你的问题,请参考以下文章

C 中的共享内存代码片段

为啥代码片段在 matplotlib 2.0.2 上运行良好,但在 matplotlib 2.1.0 上引发错误

Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段

片段之间的共享数据(父列表视图和子列表视图)

C# 获得目录创建时间的源码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段