現在基本上大大小小的項目都需要和數據庫打交道,自然而然數據庫操作會有很多地方,而使用傳統ADO.NET整個流程有點麻煩,出參都需要手動轉換為對象。基於以上,我們需要一個SQL執行工具,能簡化上訴步驟,而不失對SQL控制權。
最底層是ADO.NET,基於ADO.NET開發的工具。
1、支持多數據庫
2、支持增刪改查事務過程等常用SQL操作
3、支持參數統一化
4、支持入參多樣化,且自動轉換成SQL參數
5、支持出參多樣化,且自動轉換成對象
6、緩存方案(未完成)
7、並發控制(未完成)
8、支持表達式組件(未完成)
以下內容及源碼都僅供參考,勿用於生成環境。
1、多數據支持&擴展
以SQLite為例
1 public class SQLiteConn : ISqlConn
2 {
3 public SQLiteConn(string connectionString)
4 {
5 this.DbType = DbType.SQLITE;
6 this.ConnectionString = connectionString;
7 }
8 public DbType DbType { get; set; }
9 public string ConnectionString { get; set; }
10 public IDbConnection CreateDbConnection()
11 {
12 IDbConnection conn = new SQLiteConnection();
13 conn.ConnectionString = this.ConnectionString;
14 return conn;
15 }
16 }
1 public class SQLiteFactory : SQLiteConn, IFactory
2 {
3 public SQLiteFactory(string connectionString)
4 : base(connectionString)
5 {
6 this.DbDataParameterPrefix = "@";
7 }
8 public string DbDataParameterPrefix { get; set; }
9 public IDbDataParameter CreateDbDataParameter(string key, object value)
10 {
11 return new SQLiteParameter(key, value);
12 }
13 public string CreatePageSql(string sqlTag, int pageIndex, int pageSize)
14 {
15 string para = null;
16 para = @"select wang.* from ({0}) wang limit {1},{2}";
17 para = string.Format(para, sqlTag, pageSize * (pageIndex - 1), pageSize);
18 return para;
19 }
20 }
目前支持Oracle,SqlServer,MySql,Access,SQLite數據庫,如果要新增數據支持,只需實現ISqlConn和ISqlConn即可,具體實現同上。
2、具體測試&操作代碼

1 var sqlExe = new WangSql.SqlExe("SQLITE", conn);
2
3 Write("初始化SqlExe完成");
4
5 var site = new Site()
6 {
7 Id = Guid.NewGuid().ToString("N"),
8 Name = "site1",
9 Domain = "www.baidu.com" + Guid.NewGuid().ToString("N"),
10 Area = "web",
11 Remark = "測試"
12 };
13
14 //insert
15 Write("insert開始");
16 string sqlInsert = "insert into Site(Id,Name,Domain,Area,Remark) values(#Id#,#Name#,#Domain#,#Area#,#Remark#)";
17 var resultInsert = sqlExe.NonQuery(sqlInsert, site);
18 Write("insert結束:結果:" + resultInsert);
19
20 //select
21 Write("select開始");
22 string sqlSelect = "select * from Site";
23 var resultSelect = sqlExe.QueryObject<Site>(sqlSelect);
24 var resultSelect1 = sqlExe.QueryList<Site>(sqlSelect);
25 int resultSelectIndex = new Random().Next(resultSelect1.Count);
26 Write("select結束:結果:" + resultSelect1[resultSelectIndex].Remark);
27
28 //update
29 Write("update開始");
30 string sqlUpdate = "update Site set Remark=#Remark# where Id=#Id#";
31 var site1 = new Site()
32 {
33 Remark = "測試1",
34 Id = resultSelect1[resultSelectIndex].Id
35 };
36 var resultUpdate = sqlExe.NonQuery(sqlUpdate, site1);
37 Write("update結束:結果:" + resultUpdate);
38
39 //Transaction
40 Write("trans開始");
41 using(var trans = sqlExe.BeginTransaction())
42 {
43 string sqlTrans1 = "update Site set Remark=#Remark# where Id=#Id#";
44 var site2 = new Site()
45 {
46 Remark = "測試2",
47 Id = resultSelect1[resultSelectIndex].Id
48 };
49 var result1 = trans.NonQuery(sqlTrans1, site1);
50
51 string sqlTrans2 = "update Site set Name=#Name# where Id=#Id#";
52 var site3 = new Site()
53 {
54 Name = "SASASA3",
55 Id = resultSelect1[resultSelectIndex].Id
56 };
57 var result2 = trans.NonQuery(sqlTrans2, site1);
58
59 trans.Commit();
60 }
61 Write("trans結束");
View Code
3、具體使用&接口代碼
3.1 創建核心操作類實例SqlExe
var sqlExe = new WangSql.SqlExe("SQLITE", conn);
第一參數是數據庫類型,第二個參數是數據庫連接字符串,返回ISqlExe接口對象實例。
3.2 ISqlExe最核心的類,提供了所有數據操作方法,所有操作都是調用該接口裡的方法。

1 public interface IMySqlExe
2 {
3 int ExecuteNonQuery(string sql);
4 int ExecuteNonQuery(string sql, global::System.Data.IDbDataParameter par);
5 int ExecuteNonQuery(string sql, global::System.Data.IDbDataParameter[] par);
6 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);
7 object ExecuteProcedure(string sql, global::System.Collections.Generic.Dictionary<string, object> inpara, global::WangSql.ExcuteType excuteType = ExcuteType.Query);
8 object ExecuteProcedure(string sql, global::WangSql.ExcuteType excuteType = ExcuteType.Query);
9 global::System.Data.DataTable ExecuteReader(string sql);
10 global::System.Data.DataTable ExecuteReader(string sql, global::System.Data.IDataParameter par);
11 global::System.Data.DataTable ExecuteReader(string sql, global::System.Data.IDataParameter[] par);
12 int NonQuery(string sql);
13 int NonQuery(string sql, object para);
14 global::System.Collections.Generic.IList<T> QueryList<T>(string sql);
15 global::System.Collections.Generic.IList<T> QueryList<T>(string sql, object para);
16 T QueryObject<T>(string sql);
17 T QueryObject<T>(string sql, object para);
18 global::System.Data.DataTable QueryPage(string sql, int pageIndex, int pageSize, out int totalCount);
19 global::System.Data.DataTable QueryPage(string sql, object para, int pageIndex, int pageSize, out int totalCount);
20 global::System.Collections.Generic.IList<T> QueryPage<T>(string sql, int pageIndex, int pageSize, out int totalCount);
21 global::System.Collections.Generic.IList<T> QueryPage<T>(string sql, object para, int pageIndex, int pageSize, out int totalCount);
22 bool Transaction(global::System.Collections.Hashtable sqlList);
23 }
View Code

1 public interface ISqlExe : IMySqlExe
2 {
3 IMyTransaction BeginTransaction();
4 }
View Code
3.3 IMyTransaction是事務操作接口,在ISqlExe包含該對象。

1 public interface IMyTransaction : IDisposable
2 {
3 void Commit();
4 int NonQuery(string sql);
5 int NonQuery(string sql, object para);
6 System.Collections.Generic.IList<T> QueryList<T>(string sql);
7 System.Collections.Generic.IList<T> QueryList<T>(string sql, object para);
8 T QueryObject<T>(string sql);
9 T QueryObject<T>(string sql, object para);
10 void Rollback();
11 }
View Code
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、支持表達式組件(未完成)
上面三個還沒有完成的,對了,代碼簡單粗鄙,請勿用於生成環境,僅用於學習和交流。
地址:源碼下載
..................

..................