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. C#中将DataTable导出为HTML的方法

    今天我要向大家分享一种将DataTable导出为到HTML格式的方法.有时我们需要HTML格式的输出数据, 以下代码就可以帮助我们达到目的,. 首先,我们要绑定DataTable和 DataGridV ...

  2. C#使用Aspose.Cells导出Excel简单实现

    首先,需要添加引用Aspose.Cells.dll,官网下载地址:http://downloads.aspose.com/cells/net 将DataTable导出Xlsx格式的文件下载(网页输出) ...

  3. 14门Linux课程,打通你Linux的任督二脉!

    Linux有很多优点:安全.自主.开源--,也正是这些优点使得很多人都在学Linux. 虽说网上有大把的Linux课程资源,但是对很多小白来说网上的课程资源比较零散并不适合新手学习. 正因为此,总结了 ...

  4. NYOJ 455

    1.应该交代清楚,参加宴会的人不知道一共有多少顶帽子.假如知道有n顶帽子的话,第一次开灯看见有n-1只,自然就知道自己是第n顶黑帽子,所以应该是这n个人在第一次关灯就打自己脸,不过这么一来就没意思了, ...

  5. BRDF 光照模型

    http://blog.csdn.net/liu_lin_xm/article/details/4846144

  6. 用lucene替代mysql读库的尝试

    采用lucene对mysql中的表建索引,并替代全文检索操作. 备注:代码临时梳理很粗糙,后续修改. import java.io.File; import java.io.IOException; ...

  7. ExtJS in Review - xtype vs. alias

    今天在帮一个兄弟检查一段自定义控件的代码时觉得他对xtype以及alias的使用和ExtJS各示例代码的使用有较多的不一致,而我自己也不是很清楚使用这两个属性时的最佳方法.因此在回家后整理出了这样一篇 ...

  8. Angular2笔记:NgModule

    Angular的模块的目的是用来组织app的逻辑结构. 在ng中使用@NgModule修饰的class就被认为是一个ng module.NgModule可以管理模块内部的Components.Dire ...

  9. ABP框架 - 会话

    文档目录 本节内容: 简介 关于 IAbpSeesion 注入会话 会话属性 用户标识符 简介 如果一个应用需要登录,它就需要知道当前用户在执行的操作.尽管Asp.net自身在展现层提供了Sessio ...

  10. mac 无法识别seagate硬盘、无法向其写入文件

    1,无法识别 Seagate 硬盘 新买的mac air Captian 10.11.6系统,连上硬盘根本不出现盘符,usb插头不要插得太深,慢慢的插入,看到硬盘白灯亮起就可以了 2,无法向 Seag ...