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这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...
随机推荐
- iOS UITableView 与 UITableViewController
很多应用都会在界面中使用某种列表控件:用户可以选中.删除或重新排列列表中的项目.这些控件其实都是UITableView 对象,可以用来显示一组对象,例如,用户地址薄中的一组人名.项目地址. UITab ...
- Hadoop
Hadoop应用场景 Hadoop是专为离线处理和大规模数据分析而设计的,它并不适合那种对几个记录随机读写的在线事务处理模式. 大数据存储:Hadoop最适合一次写入.多次读取的数据存储需求,如数据仓 ...
- .NET面试题系列[3] - C# 基础知识(1)
1 类型基础 面试出现频率:基本上肯定出现 重要程度:10/10,身家性命般重要.通常这也是各种招聘工作的第一个要求,即“熟悉C#”的一部分.连这部分都不清楚的人,可以说根本不知道自己每天都在干什么. ...
- 细说SSO单点登录
什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SS ...
- 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码
不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...
- 关于VS2015支持编译Linux程序的问题
现状 目前已经发布的VS2015中包括VS2015 Preview 以及 VS2015 CTP6,这两个版本均不支持直接编译C++代码为Linux程序,具体情况可以参考 Visual Studio 2 ...
- ASP.NET Web API Selfhost宿主环境中管道、路由
ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...
- 跟我一起ggplot2(1)
ggplot2 R的作图工具包,可以使用非常简单的语句实现非常复杂漂亮的效果. qplot 加载qplot library(ggplot2) # 测试数据集,ggplot2内置的钻石数据 qplot( ...
- STM32的入侵检测是干什么用的
[引]:侵入检测的作用就是监测侵入事件,保护重要的数据不被非法窃取. 你的数据是保存在RAM里的;但是一掉电RAM里的数据就没了;有一块地方,后备电池相关的一块RAM的数据却放不掉(除非电池没电了); ...
- .NET Core采用的全新配置系统[6]: 深入了解三种针对文件(JSON、XML与INI)的配置源
物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...