現在基本上大大小小的項目都需要和數據庫打交道,自然而然數據庫操作會有很多地方,而使用傳統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、支持表達式組件(未完成)
上面三個還沒有完成的,對了,代碼簡單粗鄙,請勿用於生成環境,僅用於學習和交流。
地址:源碼下載
..................
..................