WangSql 1.0源碼共用

来源:http://www.cnblogs.com/deeround/archive/2016/12/20/6204610.html
-Advertisement-
Play Games

一,項目背景 現在基本上大大小小的項目都需要和資料庫打交道,自然而然資料庫操作會有很多地方,而使用傳統ADO.NET整個流程有點麻煩,出參都需要手動轉換為對象。基於以上,我們需要一個SQL執行工具,能簡化上訴步驟,而不失對SQL控制權。 二,核心技術 最底層是ADO.NET,基於ADO.NET開發的 ...


一,項目背景

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

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

五,源碼下載

地址:源碼下載

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

 

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

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:在Dos里切換盤符 a:在電腦左下角右擊顯示圖片;(我用的是win10系統,其他系統類似) b:點擊運行,輸入cmd; c:點擊確定: d:輸入盤符:(如f:) 或F: 只寫字母,不寫分號是不行的!如下圖: cd f:(F:)是不行的如下圖: ...
  • 我在 "Linux字元設備驅動框架" 一文中已經簡單的介紹了字元設備驅動的基本的編程框架,這裡我們來探討一下Linux內核(以4.8.5內核為例)是怎麼管理字元設備的,即當我們獲得了設備號,分配了 cdev 結構,註冊了驅動的操作方法集,最後進行 cdev_add() 的時候,究竟是將哪些內容告訴了 ...
  • snull是《Linux Device Drivers》中的一個網路驅動的例子。這裡引用這個例子學習Linux網路驅動。 因為snull的源碼,網上已經更新到適合最新內核,而我自己用的還是2.6.22.6比較舊的內核。而網上好像找不到舊版的snull。因此結合《Linux Device Driver ...
  • <! 知識的力量是無限的(當然肯定還有更簡單的方法) !> 當我考慮將省市區三級聯動數據從mysql轉入mongodb時遇到了網上無直接插入mongodb的示例(基本均是mysql插入示例)。於是想到利用json文件直接導入mongodb會比較easy(SQLyog如何導出json?) 在SQLyo ...
  • Linux內核大量使用面向對象的設計思想,通過追蹤源碼,我們甚至可以使用面向對象語言常用的UML類圖來分析Linux設備管理的"類"之間的關係。這裡以4.8.5內核為例從kobject,kset,kobj_type的分析入手,進而一探內核對於設備的管理方式 container_of巨集 這個巨集幾乎是l ...
  • 首先設定loop數量(ubuntu系統) 更改以下內容: 然後更新grub 重啟電腦 之後就可以看到loop設備數量變為64個 設定loop數量有此系統不一樣,archlinux可參考我的另一隨筆http://www.cnblogs.com/LTSperl/p/6195493.html。 然後就是今 ...
  • OAuth(開放授權)是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯繫人列表),而無需將用戶名和密碼提供給第三方應用。 OAuth 允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據.每一個令牌授權一個特定的網站(例如,視頻編輯 ...
  • ASP.NET Core應用中的路由機制實現在RouterMiddleware中間件中,它的目的在於通過路由解析為請求找到一個匹配的處理器,同時將請求攜帶的數據以路由參數的形式解析出來供後續請求處理流程使用。但是具體的路由解析功能其實並沒有直接實現在RouterMiddleware中間件中,而是由一... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...