WangSql 1.0源码共享
WangSql 3.0 已发布:WangSql 3.0源码共享(WangSql 1.0重大升级到3.0)
一,项目背景
现在基本上大大小小的项目都需要和数据库打交道,自然而然数据库操作会有很多地方,而使用传统ADO.NET整个流程有点麻烦,出参都需要手动转换为对象。基于以上,我们需要一个SQL执行工具,能简化上诉步骤,而不失对SQL控制权。
二,核心技术
最底层是ADO.NET,基于ADO.NET开发的工具。
1、支持多数据库
2、支持增删改查事务过程等常用SQL操作
3、支持参数统一化
4、支持入参多样化,且自动转换成SQL参数
5、支持出参多样化,且自动转换成对象
6、缓存方案(未完成)
7、并发控制(未完成)
8、支持表达式组件(未完成)
三,功能详解
以下内容及源码都仅供参考,勿用于生成环境。
1、多数据支持&扩展
以SQLite为例
public class SQLiteConn : ISqlConn
{
public SQLiteConn(string connectionString)
{
this.DbType = DbType.SQLITE;
this.ConnectionString = connectionString;
}
public DbType DbType { get; set; }
public string ConnectionString { get; set; }
public IDbConnection CreateDbConnection()
{
IDbConnection conn = new SQLiteConnection();
conn.ConnectionString = this.ConnectionString;
return conn;
}
}
public class SQLiteFactory : SQLiteConn, IFactory
{
public SQLiteFactory(string connectionString)
: base(connectionString)
{
this.DbDataParameterPrefix = "@";
}
public string DbDataParameterPrefix { get; set; }
public IDbDataParameter CreateDbDataParameter(string key, object value)
{
return new SQLiteParameter(key, value);
}
public string CreatePageSql(string sqlTag, int pageIndex, int pageSize)
{
string para = null;
para = @"select wang.* from ({0}) wang limit {1},{2}";
para = string.Format(para, sqlTag, pageSize * (pageIndex - ), pageSize);
return para;
}
}
目前支持Oracle,SqlServer,MySql,Access,SQLite数据库,如果要新增数据支持,只需实现ISqlConn和ISqlConn即可,具体实现同上。
2、具体测试&操作代码
var sqlExe = new WangSql.SqlExe("SQLITE", conn);
Write("初始化SqlExe完成");
var site = new Site()
{
Id = Guid.NewGuid().ToString("N"),
Name = "site1",
Domain = "www.baidu.com" + Guid.NewGuid().ToString("N"),
Area = "web",
Remark = "测试"
};
//insert
Write("insert开始");
string sqlInsert = "insert into Site(Id,Name,Domain,Area,Remark) values(#Id#,#Name#,#Domain#,#Area#,#Remark#)";
var resultInsert = sqlExe.NonQuery(sqlInsert, site);
Write("insert结束:结果:" + resultInsert);
//select
Write("select开始");
string sqlSelect = "select * from Site";
var resultSelect = sqlExe.QueryObject<Site>(sqlSelect);
var resultSelect1 = sqlExe.QueryList<Site>(sqlSelect);
int resultSelectIndex = new Random().Next(resultSelect1.Count);
Write("select结束:结果:" + resultSelect1[resultSelectIndex].Remark);
//update
Write("update开始");
string sqlUpdate = "update Site set Remark=#Remark# where Id=#Id#";
var site1 = new Site()
{
Remark = "测试1",
Id = resultSelect1[resultSelectIndex].Id
};
var resultUpdate = sqlExe.NonQuery(sqlUpdate, site1);
Write("update结束:结果:" + resultUpdate);
//Transaction
Write("trans开始");
using(var trans = sqlExe.BeginTransaction())
{
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();
}
Write("trans结束");
3、具体使用&接口代码
3.1 创建核心操作类实例SqlExe
var sqlExe = new WangSql.SqlExe("SQLITE", conn);
第一参数是数据库类型,第二个参数是数据库连接字符串,返回ISqlExe接口对象实例。
3.2 ISqlExe最核心的类,提供了所有数据操作方法,所有操作都是调用该接口里的方法。
public interface IMySqlExe
{
int ExecuteNonQuery(string sql);
int ExecuteNonQuery(string sql, global::System.Data.IDbDataParameter par);
int ExecuteNonQuery(string sql, global::System.Data.IDbDataParameter[] par);
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);
object ExecuteProcedure(string sql, global::System.Collections.Generic.Dictionary<string, object> inpara, global::WangSql.ExcuteType excuteType = ExcuteType.Query);
object ExecuteProcedure(string sql, global::WangSql.ExcuteType excuteType = ExcuteType.Query);
global::System.Data.DataTable ExecuteReader(string sql);
global::System.Data.DataTable ExecuteReader(string sql, global::System.Data.IDataParameter par);
global::System.Data.DataTable ExecuteReader(string sql, global::System.Data.IDataParameter[] par);
int NonQuery(string sql);
int NonQuery(string sql, object para);
global::System.Collections.Generic.IList<T> QueryList<T>(string sql);
global::System.Collections.Generic.IList<T> QueryList<T>(string sql, object para);
T QueryObject<T>(string sql);
T QueryObject<T>(string sql, object para);
global::System.Data.DataTable QueryPage(string sql, int pageIndex, int pageSize, out int totalCount);
global::System.Data.DataTable QueryPage(string sql, object para, int pageIndex, int pageSize, out int totalCount);
global::System.Collections.Generic.IList<T> QueryPage<T>(string sql, int pageIndex, int pageSize, out int totalCount);
global::System.Collections.Generic.IList<T> QueryPage<T>(string sql, object para, int pageIndex, int pageSize, out int totalCount);
bool Transaction(global::System.Collections.Hashtable sqlList);
}
public interface ISqlExe : IMySqlExe
{
IMyTransaction BeginTransaction();
}
3.3 IMyTransaction是事务操作接口,在ISqlExe包含该对象。
public interface IMyTransaction : IDisposable
{
void Commit();
int NonQuery(string sql);
int NonQuery(string sql, object para);
System.Collections.Generic.IList<T> QueryList<T>(string sql);
System.Collections.Generic.IList<T> QueryList<T>(string sql, object para);
T QueryObject<T>(string sql);
T QueryObject<T>(string sql, object para);
void Rollback();
}
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源码共享的更多相关文章
- WangSql 3.0源码共享(WangSql 1.0重大升级到3.0)
WangSql 1.0博文阅读: http://www.cnblogs.com/deeround/p/6204610.html 基于1.0做了以下重大改动: 1.多数据实现方式调整 2.使用EmitM ...
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
- AFNetworking 3.0 源码解读(八)之 AFImageDownloader
AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- 最近建了一个.net源码共享群,群共享有大量网友分享的.net(C#)商业源码
.net源码共享群 324087998. 本群创建于2013/6/21: 群里都是.net(C#)程序开发人员,群共享有大量网友分享的.net(C#)商业源码.比如:DTCMS旗舰版,hishop微分 ...
- AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking
AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...
- AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking
我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...
- AFNetworking 3.0 源码解读(九)之 AFNetworkActivityIndicatorManager
让我们的APP像艺术品一样优雅,开发工程师更像是一名匠人,不仅需要精湛的技艺,而且要有一颗匠心. 前言 AFNetworkActivityIndicatorManager 是对状态栏中网络激活那个小控 ...
- AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache
这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...
随机推荐
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
- OpenLiveWriter代码插件
1.OpenLiveWriter安装 Windows Live Writer在2012年就停止了更新,Open Live Writer(以下简称OLW)是由Windows Live WriterWri ...
- C# salt+hash 加密
一.先明确几个基本概念 1.伪随机数:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的算法来产生的.伪随机数并不是假随机 数,这里的" ...
- SNMP简单网络管理协议
声明:以下内容是学习谌玺老师视频整理出来(http://edu.51cto.com/course/course_id-861.html) SNMP(Simple Network Management ...
- Android—Service与Activity的交互
service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...
- Android—基于微信开放平台v3SDK,开发微信支付填坑。
接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...
- Android Weekly Notes Issue #236
Android Weekly Issue #236 December 18th, 2016 Android Weekly Issue #236 本期内容包括: Google的物联网平台Android ...
- android计算每个目录剩余空间丶总空间以及SD卡剩余空间
ublic class MemorySpaceCheck { /** * 计算剩余空间 * @param path * @return */ public static String getAvail ...
- SQL字符串函数
LEN() :计算字符串长度(字符的个数.)datalength();//计算字符串所占用的字节数,不属于字符串函数.测试varchar变量与nvarchar变量存储字符串a的区别.见备注1.LOWE ...
- mysql 大表拆分成csv导出
最近公司有一个几千万行的大表需要按照城市的id字段拆分成不同的csv文件. 写了一个自动化的shell脚本 在/home/hdh 下面 linux-xud0:/home/hdh # lltotal 1 ...