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结束");
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、支持表达式组件(未完成)
上面三个还没有完成的,对了,代码简单粗鄙,请勿用于生成环境,仅用于学习和交流。
五,源码下载
地址:源码下载
..................
..................
以上是关于WangSql 1.0源码共享的主要内容,如果未能解决你的问题,请参考以下文章
为啥代码片段在 matplotlib 2.0.2 上运行良好,但在 matplotlib 2.1.0 上引发错误
Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段