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、支持表达式组件(未完成)
上面三个还没有完成的,对了,代码简单粗鄙,请勿用于生成环境,仅用于学习和交流。
五,源码下载
地址:源码下载
..................
..................