程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WangSql 1.0源碼共享,wangsql1.0源碼

WangSql 1.0源碼共享,wangsql1.0源碼

編輯:關於.NET

WangSql 1.0源碼共享,wangsql1.0源碼


一,項目背景

現在基本上大大小小的項目都需要和數據庫打交道,自然而然數據庫操作會有很多地方,而使用傳統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、支持表達式組件(未完成)

上面三個還沒有完成的,對了,代碼簡單粗鄙,請勿用於生成環境,僅用於學習和交流。

五,源碼下載

地址:源碼下載

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

 

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

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved