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源码共享的更多相关文章

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

    WangSql 1.0博文阅读: http://www.cnblogs.com/deeround/p/6204610.html 基于1.0做了以下重大改动: 1.多数据实现方式调整 2.使用EmitM ...

  2. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  3. AFNetworking 3.0 源码解读(八)之 AFImageDownloader

    AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...

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

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

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

    .net源码共享群 324087998. 本群创建于2013/6/21: 群里都是.net(C#)程序开发人员,群共享有大量网友分享的.net(C#)商业源码.比如:DTCMS旗舰版,hishop微分 ...

  6. AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking

    AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...

  7. AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking

    我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...

  8. AFNetworking 3.0 源码解读(九)之 AFNetworkActivityIndicatorManager

    让我们的APP像艺术品一样优雅,开发工程师更像是一名匠人,不仅需要精湛的技艺,而且要有一颗匠心. 前言 AFNetworkActivityIndicatorManager 是对状态栏中网络激活那个小控 ...

  9. AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache

    这篇我们就要介绍AFAutoPurgingImageCache这个类了.这个类给了我们临时管理图片内存的能力. 前言 假如说我们要写一个通用的网络框架,除了必备的请求数据的方法外,必须提供一个下载器来 ...

随机推荐

  1. iOS UITableView 与 UITableViewController

    很多应用都会在界面中使用某种列表控件:用户可以选中.删除或重新排列列表中的项目.这些控件其实都是UITableView 对象,可以用来显示一组对象,例如,用户地址薄中的一组人名.项目地址. UITab ...

  2. Hadoop

    Hadoop应用场景 Hadoop是专为离线处理和大规模数据分析而设计的,它并不适合那种对几个记录随机读写的在线事务处理模式. 大数据存储:Hadoop最适合一次写入.多次读取的数据存储需求,如数据仓 ...

  3. .NET面试题系列[3] - C# 基础知识(1)

    1 类型基础 面试出现频率:基本上肯定出现 重要程度:10/10,身家性命般重要.通常这也是各种招聘工作的第一个要求,即“熟悉C#”的一部分.连这部分都不清楚的人,可以说根本不知道自己每天都在干什么. ...

  4. 细说SSO单点登录

    什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SS ...

  5. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码

    不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...

  6. 关于VS2015支持编译Linux程序的问题

    现状 目前已经发布的VS2015中包括VS2015 Preview 以及 VS2015 CTP6,这两个版本均不支持直接编译C++代码为Linux程序,具体情况可以参考 Visual Studio 2 ...

  7. ASP.NET Web API Selfhost宿主环境中管道、路由

    ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...

  8. 跟我一起ggplot2(1)

    ggplot2 R的作图工具包,可以使用非常简单的语句实现非常复杂漂亮的效果. qplot 加载qplot library(ggplot2) # 测试数据集,ggplot2内置的钻石数据 qplot( ...

  9. STM32的入侵检测是干什么用的

    [引]:侵入检测的作用就是监测侵入事件,保护重要的数据不被非法窃取. 你的数据是保存在RAM里的;但是一掉电RAM里的数据就没了;有一块地方,后备电池相关的一块RAM的数据却放不掉(除非电池没电了); ...

  10. .NET Core采用的全新配置系统[6]: 深入了解三种针对文件(JSON、XML与INI)的配置源

    物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...