麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

C#.Net實體代碼生成工具的使用及.NET中的ORM實現

2019-11-17 04:08:11
字體:
來源:轉載
供稿:網友
1 引言
目前大多數項目或產品都使用關系型數據庫實現業務數據的存儲,這樣在開發過程中,常常有一些業務邏輯需要直接用寫SQL語句實現,但這樣開發的結果是:遍地布滿SQL語句。這些藕合較高的SQL語句給系統的改造和升級帶來很多無法預計的障礙。為了提高項目的靈活性,特別是快速開發,ORM是一個不錯的選擇。舉個簡單的例子:在使用ORM的系統中,當數據庫模型改變時,不再需要理會邏輯代碼和SQL語句中涉及到該模型的所有改動,只需要將該模型映射的對象稍作改動,甚至不做改動就可以滿足要求。

ORM的全稱是Object Relational Mapping,即對象關系映射。它的實質就是將關系數據(庫)中的業務數據用對象的形式表示出來,并通過面向對象(Object-Oriented)的方式將這些對象組織起來,實現系統業務邏輯的過程。在ORM過程中最重要的概念是映射(Mapping),通過這種映射可以使業務對象與數據庫分離。從面向對象來說,數據庫不應該和業務邏輯綁定到一起,ORM則起到這樣的分離作用,使數據庫層透明,開發人員真正的面向對象。下圖簡單說明了ORM在多層系統架構中的這個作用。



圖1  ORM在多層系統架構中的作用



當然ORM本身并不是全能的,當遇到特別復雜的數據處理及海量數據處理和彌補拙劣的設計不足時還得歸結到SQL或存儲過程來實現。所以快速開發、面向對象和性能優化靈活必須兼顧才行,這些該工具可以很好的做到,下文分別一一介紹。



2 內容
2.1 ORM的工具實現:C#.Net實體代碼生成工具(EntitysCodeGenerate)
優秀的ORM工具不僅可以幫助我們很好的理解對象及對象的關系,而且工具本身會幫助我們維護這些關系,并且幫助我們記住字段屬性業務含義及提供輔助的應用等。基于這個理念,我于多年的項目實踐和業余時間設計開發了一個基于.NET的ORM工具——C#.Net實體代碼生成工具(EntitysCodeGenerate),該工具運行于dotnetframework2.0框架下,希望多多交流并指正。

C#.Net實體代碼生成工具(EntitysCodeGenerate) 為ORM提供對象持久、簡單對象查詢、事務處理等功能。數據持久包括一些對象的Insert、Update、Save、Delete、Select等功能,簡單對象查詢則提供一些基于對象的簡單對象查詢GetEntity等。該工具是基于VS.NET 2005的開發的應用程序,職責是從數據庫中提取生成實體類代碼并幫助開發人員快速映射關系數據庫中的業務模型的映射實體類,暫時只提供從Oracle、SqlServer、access數據庫生成C#代碼的支持,可以生成實體及實體集的相關文件,并自動提取數據庫表和字段的注釋說明和對應的數據類型等。

另外所生成的代碼文件只需修改數據庫連接,即可用于目前市場上ado.net支持的各種類型的數據庫,如Oracle、Access、SqlServer、MySQLExcel等。

在ORM實現的前期工作中,為了實現屏蔽各種數據庫之間的操作差異,我們需要定義數據操作公有接口,封裝基本的數據庫增、刪、改、查等操作。下面以工具當前3.1版以數據庫Oracle的為例介紹。

3.1版實體層代碼有個基類,基類里其實也就是你項目的數據連接及類型的配置,該工具的實際應用時配置其實也就在這里,默認為生成代碼時所填寫的數據庫連接信息,并可手工擴展修改:

public class BaseEntity

{

public static string GetConnectionString()

{

    return "User ID=scott;PassWord=tiger;Data Source=85";//數據庫連接設置可修改從別處讀取

}

public static DatabaseType GetDatabaseType()

{

    return DatabaseType.Oracle; //數據庫連接類型設置也可修改從別處讀取

}

……

}



這里可設置該命名空間當前實體下的數據庫連接類型及數據庫連接字符串,當然也可以修改成從其它配置文件中讀取。以前的版本是放在全局設置DbConnectString這個類里面,這樣的缺陷是當一個項目有多個數據庫時將不好處理,而現在通過使用基類及命名空間則很容易解決。

此外,我們還需要定義下層各種數據庫操作的公共組件

namespace System.Database

{
    public class DbCore : IDisposable

{
……

public int ExecuteNonQuery(DBCommandWrapper command){…}

public DataSet ExecuteDataSet(DBCommandWrapper command){…}

……
}

}



再定義數據庫操作類及數據庫的基類和數據庫連接的工廠類,實現各種不同類型的數據。

public abstract class DBCommandWrapper {……}

internal abstract class Database{……}

internal sealed class DatabaseFactory{……}

……



然后實現各種數據庫的操作類,以Oracle為例

internal class OracleDatabase : Database{…}

public class OracleCommandWrapper : DBCommandWrapper{…}



最后在生成的實體類及基類文件中生成相應的數據庫Insert,Update,Delete,GetEntity,Save等操作和類型映射代碼如下所示:

        public int Insert()

        {

            ORMap<BaseEntity> ormap = new ORMap<BaseEntity>(this);

            DEPT entity = new DEPT();

            return ormap.Insert(entity);

}

……

public static System.Data.DbType GetDBTypeByFullName(string strTypeFullName)

        {

            switch (strTypeFullName)

            {

                case "System.Byte":

                    return System.Data.DbType.Byte;

                case "System.Boolean":

                    return System.Data.DbType.Boolean;

                case "System.Char":

                    return System.Data.DbType.Byte;

                case "System.DateTime":

                    return System.Data.DbType.DateTime;

                case "System.Decimal":

                    return System.Data.DbType.Decimal;

                 ……

                default:

                    return System.Data.DbType.Object;

            }

        }



在生成代碼的同時,工具自動添加實體類的屬性標示及字段注釋說明等如下所示:

     [Serializable(),Description("PRimary:DEPTNO")]

     public class DEPT:BaseEntity

     {

       ……

         /// <summary>

         /// 主鍵

         /// </summary>

       [DataObjectField(true)]

         public int DEPTNO

         {

              set{ _deptno=value;}

              get{return _deptno;}

         }

         /// <summary>

         ///

         /// </summary>

        [DataObjectField(false)]

         public string DNAME

         {

              set{ _dname=value;}

              get{return _dname;}

         }

       ……

}



實體中的summary中的注釋自動將數據中表及字段的注釋說明提取到這里,方便程序員在代碼編寫及維護中交流使用,理解其所對應的業務含義。示例是以Oracle數據庫自帶的示例庫為例介紹的,數據庫自帶的實例庫scott/tiger表注釋為空,所以這里實體字段提取出注釋也是為空。



實體定義完成后,我們需要根據實體類中綁定的屬性構造出運行期需要的SQL語句,收集實體類定義中的數據結構描述,再定義一個類來說明實體在運行期所引用到的所有關于數據持久的信息,包括關鍵字字段,一般字段等。同時需要一個字段的元數據字段在數據庫中的名稱,大小,是否可為空,列類型等信息。這些條件具備后,再定義解析類,負責轉換數據的程序類型到數據庫字段類型,并且構造出Insert,Update,Delete,Select,Save等操作所需要的SQL語句,再去調用數據操作公有接口DbCore,即可實現。同時數據操作公有接口System.Database.DbCore結合實體類可將簡單或復雜及事務的操作更為方便的實現,下文著重介紹在實際中的使用。數據庫操作默認以實體對應表的主鍵為準,當然也可以指定條件,引入增加和更新合并為一個保存操作,由實體對象本身自己判斷是增加還是更新操作。





2.2 在開發中的實際應用
C#.Net實體代碼生成工具(EntitysCodeGenerate)安裝后,在生成對應的實體代碼后都會有個“相關配置”文件夾,里面有“配置說明”文檔和相關文件,實際使用時只須按“配置說明”文檔操作即可。使用該工具開發的項目,可以做到很好的切換到異構數據庫,且只需變動數據庫連接接口即可(即只須修改GetDatabaseType()/GetConnectionString())。同時提供了ORMaping.dll(1.0版本引用),System.Database.dll(2.0/3.0/3.1版本引用)安裝目錄下有相應的chm格式幫助文檔,是對這兩個dll單獨使用的說明,支持自定義的數據庫訪問,并可結合生成的實體操作數據庫,提供良好的事務處理等。其中ORMaping.dll支持Oracle;System.Database.dll默認支持Oracle,并可用于各種類型的數據庫訪問,如SqlServer、MySQL等。工具所生成的代碼和提供的文件,都是可選配的,可單獨使用也可配置使用,比如:你可以只生成實體代碼,而不生成對應的數據庫操作,這樣就不需要相應的配置文件,只須將代碼文件拷貝或生成到對應目錄下即可。但是選擇帶數據庫操作的實體文件的功能更強大些,否則只能發揮實體及實體集的基本通用功能。實體代碼的生成界面比較簡單如下所示:




這里,只須選擇數據庫類型輸入正確的數據庫連接字符串、代碼文件的輸出目錄和代碼命名空間即可。實體數據類型以”數據類型映射文件”為準,工具提供了系統默認的類型映射,若有自定義的類型,可在”數據類型映射文件”里修改,可配置到數據類型的精確刻度。若修改過程中想恢復默認的配置,只須點擊”生成”按鈕即可。準備工作做好后,單擊”生成代碼”按鈕,生成成功之后按提示生成的配置說明文檔,將實體及實體集代碼文件和基類文件拷貝到指定目錄并添加ORMap.dll、System.Database.dll的引用即可。操作簡單這里就不在此贅述,下面開始介紹實體對象的數據庫操作的工作。

先介紹單個實體類的數據庫操作是如何工作的:

2.2.1 單個實體對象數據庫操作

這里還是以Oracle附帶庫DEPT為例來做說明,首先做對象的聲明

DEPT entity   = new DEPT();



下面以該對象來做闡述。

1、獲取一個實體對象信息GetEntity

實體的操作默認以主鍵為準,對單個實體信息的獲取可簡單如下實現:

entity.DEPTNO = 50;

entity         = entity.GetEntity();



返回主鍵字段DEPTNO=50的對象,若數據庫中沒有對應的記錄則返回null。DEPT表的主鍵字段是DEPTNO,同時對聯合主鍵也是支持的,下文同此;GetEntity同時提供其它指定條件的重載,也可以使用GetEntityByEntityCondition,當指定條件有多個記錄符合時只返回首條記錄;返回多條記錄可使用GetDataTable方法。

2、新增一個實體對象

新增一個對象代碼可如下所示:

entity.DEPTNO = 51;

entity.DNAME  = “DNAME1”;

entity.LOC    = “LOC1”;

entity.Insert();



同時Insert提供多種相應的重載和InsertAll方法;Insert和InsertAll區別是:Insert在插入記錄時會比較對象初始的字段值,將與初始值不同的值插入,其余的以表字段的默認方式處理;InsertAll則是插入全部字段,即使是對象的初始值沒有改變也會插入。

3、更新一個實體對象

更新一個對象代碼可如下所示:

entity.DEPTNO = 51;

entity.DNAME  =  “DNAME2”;

entity.LOC    = “LOC2”;

entity.Update();



Update也提供多種相應的重載和UpdateAll方法;Update和UpdateAll區別是:Update在更新記錄時會比較對象初始的字段值,將與初始值不同的值進行更新,其余的表字段不更新;UpdateAll則是更新全部字段,即使是對象的初始值沒有改變也會將對象的初始值更新到表里。可根據情況選擇使用。

4、保存一個實體對象

保存是該工具新增的功能,即將新增和更新合并到一個保存功能里,ORM會自動解析是新增還是更新,保存一個對象的代碼可如下所示:

entity.DEPTNO = 51;

entity.DNAME  = “DNAME3”;

entity.LOC    = “LOC3”;

entity.Save();



保存操作也是默認以主鍵為準,對多個聯合主鍵也是支持的,不帶參數的保存默認是按主鍵判斷有對應的記錄就更新,沒有就插入新記錄。同時Save提供多種重載和SaveAll、SaveByEntityCondition方法,Save和SaveAll區別同新增和更新。

5、刪除一個對象

刪除可如下代碼所示:

entity.DEPTNO = 51;

entity.Delete();



刪除操作也是默認以主鍵為準,對多個聯合主鍵也支持,同時也提供多種指定條件的重載方法。最后附加說明實體對象的增刪改保存操作都會返回一個int值,該值返回表中記錄受影響的行數。

從這些代碼可以明顯的看到,這里常用的數據增、刪、改、查操作只需很簡單幾句即可實現,少寫了很多代碼,是不是很好?

6、取得實體映射表數值字段的最大ID+1

代碼可如下:

int intID   = entity.GetInt32MaxID();



這里獲取實體對象對應表字段默認第一個主鍵的最大值ID+1,類型為整型,同時提供GetInt?MaxID多種重載,即有整型和長整型及指定字段等。

本節介紹的都是單表無事務的操作,下節開始介紹多表及事務處理的操作。





2.2.2 多個實體對象及事務處理并結合System.Database 的工作

這里簡略介紹實體對象結合System.Database.DbCore及事務處理是如何工作的,先看以下代碼(可參見安裝示例代碼System.Database.Demo):

Entitys.Common.LC_WORKTYPE entity = new Entitys.Common.LC_WORKTYPE();

entity.ID = 1;

entity.TYPENAME = "TYPENAME";

string strConnection = "Password=newaqfx;User ID= newaqfx;Data Source=85";

DbCore dbCore = new DbCore(DatabaseType.Oracle, strConnection);

dbCore.Open();

dbCore.BeginTransaction();

dbCore.Save(new Entitys.Common.LC_WORKTYPE(), entity);

entity.DESCRIPTION = "類型描述";

dbCore.Save(new Entitys.Common.LC_WORKTYPE(), entity);

entity.TYPENAME = "作業類型";

dbCore.Save(new Entitys.Common.LC_WORKTYPE(), entity);

DataSet ds = dbCore.ExecuteDataSet("select * from lc_worktype");



entity.ID = 1;

DataTable dt = dbCore.GetDataTableByEntityKey(entity);

int intRecord = dbCore.Delete(entity);

dt = dbCore.GetDataTableByEntityKey(entity);



dbCore.CommitTransaction();

dbCore.Close();



這里使用另外一個實體LC_WORKTYPE(映射安全風險系統的"作業類型"表),BeginTransaction()為開始事務的標志,CommitTransaction()為提交當前事務,還一個是RollbackTransaction()表示回滾當前事務,放棄當前事務下所有數據的更改。這樣在事務開始和提交或回滾之間可以進行多個實體的操作,并將結果最終一起提交或回滾撤銷。這里Save有兩個參數第一個是實體對象的初始類用于比較實體的初始值,第二個是要保存的對象,該方法依據主鍵自動判斷表數據是更新還是插入;同時與Save類似的方法有SaveAll保存全部字段,同時也有Insert、InsertAll、Update、UpdaAll、Delete、IsExitByEntityKey、Exists、Get?MaxId等等方法,均可相互結合使用,方法都有詳盡的說明及示例代碼。該方法執行過程中可單步跟蹤,查看該事務下每步命令執行后對應的數據集信息。

下面再看以Oracle自帶的scott庫為例一段代碼Delete、Insert、Update并結合事務使用的代碼:

DbCore dbCore = null;

try

{

    EMP entity1 = new EMP();

    DataSet ds = new DataSet();

    entity1.EMPNO = 7369;           //設置主鍵EMPNO為

    entity1 = entity1.GetEntity();  //取得主鍵EMPNO為實體對象信息



//return "User ID=scott;Password=tiger;Data Source=85";

dbCore = new DbCore(Entitys.Common.BaseEntity.GetConnectionString());

    dbCore.Open();

    dbCore.BeginTransaction();



    //選擇當前事務下的所有雇員EMP的信息

    ds = dbCore.SelectAll().From(entity1).ExecuteDataSet();



    dbCore.Delete(entity1);//刪除主鍵EMPNO為7369的記錄

    ds = dbCore.SelectAll().From(entity1).ExecuteDataSet();//查看當前事務下記錄,當前刪除記錄將不在此顯示



    dbCore.Insert(new EMP(), entity1);//插入剛才刪除主鍵EMPNO為7369的記錄

    ds = dbCore.SelectAll().From(entity1).ExecuteDataSet();//查看當前事務下記錄,可見剛剛插入的新記錄



    entity1.SAL = entity1.SAL + 100;//薪水加100

    dbCore.Update(new EMP(), entity1);//更新

    ds = dbCore.SelectAll().From(entity1).ExecuteDataSet();//查看當前事務下記錄,對應薪水SAL已更新



    entity1.SAL = entity1.SAL - 100;// 薪水減100

    dbCore.Update(new EMP(), entity1);//更新

    ds = dbCore.SelectAll().From(entity1).ExecuteDataSet();//查看當前事務下記錄,對應薪水SAL已更新



    dbCore.CommitTransaction();

    dbCore.Close();

}

catch (Exception ex)

{

    if (dbCore != null)

    {

        dbCore.Close();

    }

}



上面的Insert、Update方法都可以Save方法來取代,Save方法會自動判斷是Update還是Insert,這里只是用來展示之用。



誠然ORM本身并不是全能,當遇到特別復雜的數據處理及海量數據處理、性能優化和彌補拙劣的設計時,還得歸結到SQL或存儲過程來實現才是好的選擇。實際項目中仍然會有海量復雜的數據處理及復雜查詢和不同類型數據庫、SQL語句優化和存儲過程等等,使用System.Database.DbCore都可很好的解決,該組件支持目前市場上ado.net支持的各種類型的數據庫,可執行自定義編寫的SQL語句和存儲過程等,這樣可針對復雜功能特殊處理及性能優化等。

System.Database.DbCore可直接用于Oracle、SqlServer、MySql和支持OleDb、Odbc類型的數據庫,代碼分別如下:

DbCore dbCore = new DbCore(DatabaseType.Oracle, “OracleConnectionString”);

DbCore dbCore = new DbCore(DatabaseType.SqlServer, “SqlServerConnectionString”);

DbCore dbCore = new DbCore(DatabaseType.MySql, “MySqlConnectionString”);

DbCore dbCore = new DbCore(DatabaseType.OleDb, “OleDbConnectionString”);

DbCore dbCore = new DbCore(DatabaseType.Odbc, “OdbcConnectionString”);





再來看一段適合Oracle和SqlServer訪問的通用代碼:

DbCore dbCore = PublicClass.GetNewDbCore();

string strParaToken = dbCore.GetCurrentParameterToken;

string strSql = "INSERT INTO dept (deptno, dname, loc) VALUES (" + strParaToken + "deptno, " + strParaToken + "dname, " + strParaToken + "loc)";

dbCore.Open();              //打開數據庫連接

dbCore.BeginTransaction();  //開始事務



DBCommandWrapper cmd = dbCore.GetSqlStringCommandWrapper(strSql);

//cmd.AddParameter(..);//為命令增加一個參數實例

cmd.AddInParameter(strParaToken + "deptno", DbType.Int32, 99);

cmd.AddInParameter(strParaToken + "dname", DbType.String, "部門名稱");

cmd.AddInParameter(strParaToken + "loc", DbType.String, "locTest");



int intMaxDeptId = dbCore.GetInt32MaxId("dept", "deptno");//當前表的deptno最大值



dbCore.ExecuteNonQuery(cmd);

intMaxDeptId = dbCore.GetInt32MaxId("dept", "deptno");//插入數據deptno=99之后當前表的deptno最大值



strSql = "DELETE dept WHERE deptno = " + strParaToken + "deptno";

DBCommandWrapper cmd1 = dbCore.GetSqlStringCommandWrapper(strSql);

cmd1.AddInParameter(strParaToken + "deptno", DbType.Int32, 99);

dbCore.ExecuteNonQuery(cmd1);

intMaxDeptId = dbCore.GetInt32MaxId("dept", "deptno");//刪除數據deptno=99之后當前表的deptno最大值



dbCore.RollbackTransaction();//回滾撤銷事務。等于該方法什么都沒做,只是演示作用



intMaxDeptId = dbCore.GetInt32MaxId("dept", "deptno");

dbCore.Close();//關閉數據庫連接





其中第一句的PublicClass.GetNewDbCore()方法體代碼可以是new DbCore(DatabaseType.Oracle, “OracleConnectionString”)也可以是new DbCore(DatabaseType.SqlServer, “SqlServerConnectionString”),當new的是Oracle時即表示操作訪問的是Oracle數據庫,當new的是SqlServer即表示操作訪問的是SqlServer數據庫。dbCore.GetCurrentParameterToken即是獲取對應數據庫連接參數的前導符(如:Oracle是“:”,SQL Server是“@”等),這里也可以結合使用dbCore.StandardSqlWithParameters方法對當前帶參數的SQL語句進行標準化通用處理,即所寫SQL可以用于如MySql/Access數據庫等。這里的數據庫操作同樣也是可以同實體對象一塊協同工作。dbCore.GetSqlStringCommandWrapper(…)創建一個SQL語句的命令,dbCore. GetStoredProcCommandWrapper(…)創建一個執行存儲過程的命令,可根據項目自身實際需要選擇使用。

對專有數據庫命令也可以轉化為指定數據庫命令來使用,這樣可針對該數據庫特性使用更多的方法,如Oracle、SqlServer的命令轉化可像下列代碼來轉化:

OracleCommandWrapper cmd = dbCore.GetSqlStringCommandWrapper(strSql) as OracleCommandWrapper;

SqlCommandWrapper cmd = dbCore.GetSqlStringCommandWrapper(strSql) as SqlCommandWrapper;

……





這里順便說明一下當程序執行出現錯誤時可使用dbCore.Close()來關閉當前打開的數據庫連接,如下代碼所示:

catch (Exception ex)

{

    if (dbCore != null)

    {

        dbCore.Close();

    }

    MessageBox.Show(ex.Message);

}



最后再說一個System.Database.DbCoreConnectLimit.AllDBMaxConnectionCount,可以設置數據庫可打開的最大連接數目,默認不受限制。


2.2.3 數據查詢

如一般的關系型數據庫所具有的查詢功能一樣,EntitysCodeGenerate也有著非常豐富的查詢功能,如對象查詢、數據集查詢、函數查詢、條件查詢、排序查詢、分組等。這里對數據查詢做簡單介紹。EntitysCodeGenerate提供ENTITYColumn類幫助System.Database.DbCore.Select從數據源查詢數據,Select通過ENTITYColumn實體屬性,構造查詢語句。Select在運行時定義查詢篩選語句,并執行返回結果數據集。

1、 簡單的對象查詢GetEntity

簡單對象查詢GetEntity,見上篇單個實體對象數據庫操作一節的第一段所述,這里就不在贅述。

2、 ORM結構化查詢

這里先介紹表實體原描述信息類ENTITYColumn,ENTITY為表實體類對應的占位符,其類下有實體所對應的表的表名和表字段的公共靜態只讀信息。其中的TableName為每個該類的對應表名,各屬性字段為表名、字段名、字段對應類型的完全限定名,以純鍵盤不能直接輸入的偏僻符號’ ┋’為分割拼接而成。ORM結構化查詢類可使用該類。

2.1、Select查詢

System.Database.DbCore類提供Select方法及其相應的重載,以SqlServer自帶的pubs庫為例,可見如下代碼:

DataSet ds = new DataSet();
DbCore dbCore =
new DbCore(DatabaseType.SqlServer, "Server=(local);User id=sa;Pwd=sa;Database=pubs");

DataSet ds = dbCore.SelectAll().From("sales").ExecuteDataSet();

DataSet ds = dbCore.SelectAll().From(SALESColumn.TableName).ExecuteDataSet();

DataSet ds =
dbCore.Select(SALESColumn.ord_num).From(SALESColumn.TableName).ExecuteDataSet();

DataSet ds =
dbCore.Select(SALESColumn.ord_num).SelectColumn(SALESColumn.ord_date).From(SALESColumn.TableName).ExecuteDataSet();

DataSet ds = dbCore.SelectAll().From(new SALES()).ExecuteDataSet();



其中的dbCore.SelectAll()方法缺省默認參數為查詢所有字段,Select()不選擇出任何字段,僅初始化實例,同時也可直接使用SQL語法的字符串也可使用相應的ENTITYColumn類SALESColumn的屬性字段作為參數,或數組集合信息。也可用SelectColumn添加要查詢的字段,SelectColumn(…)接受SQL表字段名字符串或ENTITYColumn類的屬性字段格式的參數,SelectColumns(…)接受符合SelectColumn格式的數組參數,同時也提供SelectCustom(…)接受自定義的SQL語法的字符參數。同時鑒于SelectColumn等方法名較長,提供Add替代SelectColumn,AddMax、Min、Avg分別替代SelectColumnMax、Min、AvgValue各種同構方法,便于代碼的抒寫。

From(…)為查詢的目標表名,這里使用的是SALESColumn.TableName,也可直接使用表名字符串,同時接受實體對象作為參數。ExecuteDataSet()執行查詢并返回在內存當中的DataSet格式的結果數據集。ExecuteReader()執行查詢并返回只讀向前的數據結果集流IDataReader;ExecuteScalar()快速執行查詢并返回第一行第一列的Object值,下同。

2.2、From連接查詢

先見如下代碼:

DataSet ds = new DataSet();DataSet ds1 = new DataSet();
DbCore dbCore =
new DbCore(DatabaseType.SqlServer, "Server=(local);User id=sa;Pwd=sa;Database=pubs");

ds = dbCore.SelectAll().From().JoinInner("sales", "stor_id ", "stores", "stor_id")
.ExecuteDataSet();

ds = dbCore.SelectAll().From().JoinInner(SALESColumn.stor_id, STORESColumn.stor_id)
.ExecuteDataSet();

ds = dbCore.SelectAll().From().JoinLeft("sales", "stor_id ", "stores", "stor_id")
.ExecuteDataSet();

ds = dbCore.SelectAll().From().JoinLeft(SALESColumn.stor_id, STORESColumn.stor_id)
.ExecuteDataSet();

ds = dbCore.SelectAll().From().JoinRight("sales", "stor_id ", "stores", "stor_id")
.ExecuteDataSet();

ds = dbCore.SelectAll().From().JoinRight(SALESColumn.stor_id, STORESColumn.stor_id)
.ExecuteDataSet()

ds = dbCore.SelectAll().From().JoinFull("sales", "stor_id ", "stores", "stor_id")
.ExecuteDataSet();

ds = dbCore.SelectAll().From().JoinFull(SALESColumn.stor_id, STORESColumn.stor_id)
.ExecuteDataSet();



這里是以SqlServer系統自帶pubs示例庫的表sales、stores為例介紹的,JoinInner為內連接、JoinLeft為左外連接、JoinRight為右外連接、JoinFull完全外連接。參數可直接使用表名及表字段名字符串,或使用SALESColumn、 STORESColumn類,其中使用實體類靜態屬性字段代碼可讀性及維護性更好些。下面看下Where的使用。



2.3、Where語句的Condition條件

DataSet ds = new DataSet();
DataSet ds1 = new DataSet();
DbCore dbCore =
new DbCore(DatabaseType.SqlServer, "Server=(local);User id=sa;Pwd=sa;Database=pubs");

ds = dbCore.SelectAll().From().JoinInner("sales", "stor_id ", "stores", "stor_id")
.Where().ConditionAndEqual("sales","stor_id", 7067).ExecuteDataSet();

ds1 = dbCore.SelectAll().From().JoinInner(SALESColumn.stor_id, STORESColumn.stor_id)
.Where().ConditionAndEqual(SALESColumn.stor_id, 7067).ExecuteDataSet();



ds = dbCore.SelectAll().From().JoinInner("sales", "stor_id ", "stores", "stor_id")
.Where().ConditionAndGreat("sales", "stor_id", 7896)
. ConditionOrLessEqual("sales", "stor_id", 7067).ExecuteDataSet();

ds1 = dbCore.SelectAll().From().JoinInner(SALESColumn.stor_id, STORESColumn.stor_id)
.Where().ConditionAndGreat(SALESColumn.stor_id, 7896)
.ConditionOrLessEqual(SALESColumn.stor_id, 7067).ExecuteDataSet();



ds = dbCore.SelectAll().From("sales").FromTable("stores")

.Where().ConditionColumnAndEqual("sales", "stor_id", "stores", "stor_id").
ConditionAndBetweenAnd("sales", "stor_id", 7067, 7896).ExecuteDataSet();

ds1 = dbCore.SelectAll().From(SALESColumn.TableName).FromTable(STORESColumn.TableName)
.Where().ConditionColumnAndEqual(SALESColumn.stor_id, STORESColumn.stor_id).
ConditionAndBetweenAnd(SALESColumn.stor_id, 7067, 7896).ExecuteDataSet();



這里再次展示了使用字符串和ENTITYColumn類的相互比較,可見使用ENTITYColumn更直觀,可讀及維護性更好些。Where()是不帶參數的實例化方法,所添加的查詢條件均以Condition…開頭,在這里可以添加關系運算包括=,<, >, <= , >=,<>,BetweenAnd,in,not in,null,not null,like,not like和各自的關系and,or比較 及表字段與字段之間的=,<, >, <= , >=,<>關系and,or的連接等;另外還可以添加自定義的Where條件語句等。



2.4、Order By排序功能

這里切換到Oracle數據庫,以Oracle自帶的scott用戶為例,先看如下代碼:

DataSet ds = new DataSet();
DataSet ds1 = new DataSet();
EMP entity = new EMP();
DbCore dbCore = new DbCore(DatabaseType.Oracle, "Password=tiger;User ID=scott;Data Source=85");

ds = dbCore.SelectAll().From(entity)
.Where().ConditionAndGreat(entity, EMPColumn.DEPTNO, 20)
.OrderBy(EMPColumn.SAL).ExecuteDataSet();

ds = dbCore.SelectAll().From(entity)
.Where().ConditionAndGreat(entity, EMPColumn.DEPTNO, 20)
.OrderBy().Asc(EMPColumn.SAL).ExecuteDataSet();

ds = dbCore.SelectAll().From(entity)
.Where().ConditionAndGreat(entity, EMPColumn.DEPTNO, 20)
.OrderBy().Desc(EMPColumn.SAL).ExecuteDataSet();

ds1 = dbCore.SelectAll().From(EMPColumn.TableName)
.Where().ConditionAndGreat(EMPColumn.DEPTNO, 20).ExecuteDataSet();



其中entity為雇員表EMP對應的實體對象,這里也使用查詢表名的地方也可直接用實體對象。OrderBy默認不帶排序參數,只實例化對象,也可帶排序字段,排序方式為升序;其后使用Asc添加升序字段,Desc添加降序字段。



2.5、Group By分組及分組條件和排序功能

這里同樣以Oracle自帶的scott用戶為例,先看如下代碼:

DataSet ds = new DataSet();
DataSet ds1 = new DataSet();
EMP entity = new EMP();
DbCore dbCore = new DbCore(DatabaseType.Oracle, "Password=tiger;User ID=scott;Data Source=85");

ds = dbCore.Select().SelectColumnMaxValue(EMPColumn.EMPNO)
.SelectColumnMinValue(EMPColumn.EMPNO).SelectColumnAvgValue(EMPColumn.EMPNO)
.From(EMPColumn.TableName)
.GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL)
.Having().ConditionAndGreatEqual(EMPColumn.DEPTNO,10)
.ConditionAndLessEqual(EMPColumn.DEPTNO, 40).ExecuteDataSet();

ds1 = dbCore.Select().AddMax(EMPColumn.EMPNO)
.AddMin(EMPColumn.EMPNO).AddAvg(EMPColumn.EMPNO)
.From(EMPColumn.TableName)
.GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL)
.Having().ConditionAndGreatEqual(EMPColumn.DEPTNO, 10)
.ConditionAndLessEqual(EMPColumn.DEPTNO, 40).ExecuteDataSet();



ds = dbCore.Select().SelectColumn(EMPColumn.DEPTNO).SelectColumn(EMPColumn.SAL)
.SelectColumnMaxValue(EMPColumn.EMPNO).SelectColumnMinValue(EMPColumn.EMPNO)
.SelectColumnAvgValue(EMPColumn.EMPNO)
.From(EMPColumn.TableName)

.GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL)
.Having().ConditionAndGreatEqual(EMPColumn.DEPTNO, 10)
.ConditionAndLessEqual(EMPColumn.DEPTNO, 40)
.OrderBy(EMPColumn.DEPTNO).Asc(EMPColumn.SAL).Asc("3").ExecuteDataSet();

ds1 = dbCore.Select().Add(EMPColumn.DEPTNO).Add(EMPColumn.SAL)

.AddMax(EMPColumn.EMPNO).AddMin(EMPColumn.EMPNO).AddAvg(EMPColumn.EMPNO)
.From(EMPColumn.TableName)
.GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL)
.Having().ConditionAndGreatEqual(EMPColumn.DEPTNO, 10)
.ConditionAndLessEqual(EMPColumn.DEPTNO, 40)
.OrderBy(EMPColumn.DEPTNO).Asc(EMPColumn.SAL).Asc("3").ExecuteDataSet();



ds = dbCore.Select().SelectColumn(EMPColumn.DEPTNO).SelectColumn(EMPColumn.SAL)
.SelectColumnMaxValue(EMPColumn.EMPNO).SelectColumnMinValue(EMPColumn.EMPNO)
.SelectColumnAvgValue(EMPColumn.EMPNO)
.From(EMPColumn.TableName)
.Where().ConditionAndBetweenAnd(EMPColumn.MGR, 7698, 7788)
.ConditionAndGreatEqual(EMPColumn.HIREDATE, new DateTime(1981, 5, 1))
.ConditionAndLessEqual(EMPColumn.HIREDATE, DateTime.Today)
.GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL)
.Having().ConditionAndGreatEqual(EMPColumn.DEPTNO, 10)
.OrderBy(EMPColumn.DEPTNO).Asc(EMPColumn.SAL).Asc("3").ExecuteDataSet();

ds1 = dbCore.Select().Add(EMPColumn.DEPTNO).Add(EMPColumn.SAL)
.AddMax(EMPColumn.EMPNO).AddMin(EMPColumn.EMPNO).AddAvg(EMPColumn.EMPNO)
.From(EMPColumn.TableName)
.Where().ConditionAndBetweenAnd(EMPColumn.MGR, 7698, 7788)
.ConditionAndGreatEqual(EMPColumn.HIREDATE, new DateTime(1981, 5, 1))
.ConditionAndLessEqual(EMPColumn.HIREDATE, DateTime.Today)
.GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL)
.Having().ConditionAndGreatEqual(EMPColumn.DEPTNO, 10)
.OrderBy(EMPColumn.DEPTNO).Asc(EMPColumn.SAL).Asc("3").ExecuteDataSet();



ds = dbCore.Select().SelectColumn(EMPColumn.DEPTNO).SelectColumn(EMPColumn.SAL)
.SelectColumnMaxValue(EMPColumn.EMPNO).SelectColumnMinValue(EMPColumn.EMPNO)
.SelectColumnAvgValue(EMPColumn.EMPNO)
.From(EMPColumn.TableName)
.Where().ConditionAndGreatEqual(EMPColumn.EMPNO, 7654)
.GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL).ExecuteDataSet();

ds = dbCore.Select().SelectColumn(EMPColumn.DEPTNO).SelectColumn(EMPColumn.SAL)
.SelectColumnMaxValue(EMPColumn.EMPNO).SelectColumnMinValue(EMPColumn.EMPNO)
.SelectColumnAvgValue(EMPColumn.EMPNO)
.From(EMPColumn.TableName)
.Where().ConditionAndGreatEqual(EMPColumn.EMPNO, 7654)
.GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL)
.ConditionAndLessEqual(EMPColumn.DEPTNO, 40)
.OrderBy(EMPColumn.DEPTNO).Asc(EMPColumn.SAL).Asc("3").ExecuteDataSet();

ds = dbCore.Select().SelectColumn(EMPColumn.DEPTNO).SelectColumn(EMPColumn.SAL)
.SelectColumnMaxValue(EMPColumn.EMPNO).SelectColumnMinValue(EMPColumn.EMPNO)
.SelectColumnAvgValue(EMPColumn.EMPNO)
.From(EMPColumn.TableName)
.Where().ConditionAndBetweenAnd(EMPColumn.MGR, 7698, 7788)
.GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL)
.Having().ConditionAndGreatEqual(EMPColumn.DEPTNO, 10)
.ConditionAndLessEqual(EMPColumn.DEPTNO, 40)
.OrderBy(EMPColumn.DEPTNO).Asc(EMPColumn.SAL).Asc("3").ExecuteDataSet();



這里ds、ds1變量分別對應同樣功能不同語句寫法的數據集信息。同時展示了Add替代SelectColumn,AddMax、Min、Avg分別替代SelectColumnMax、Min、AvgValue的示例代碼。Where和GroupBy、Having、OrderBy可同時使用,也可分開使用。最后三個展示了分別以Where和GroupBy、Having、OrderBy分開使用的例子。其中分組使用Column(…)添加分組字段。可以很明顯的看出些語句的功能,和SQL語句的抒寫幾乎一致。如:倒數第四、五段的代碼(粗體部分,兩段代碼功能相同,只是使用方法略異)換算成SQL語句就是(假設今天是2009-10-11):

SELECT emp.deptno, emp.sal,
MAX(emp.empno) AS max_emp_empno, MIN(emp.empno) AS min_emp_empno, AVG(emp.empno) AS avg_emp_empno
FROM   emp
WHERE  emp.mgr BETWEEN 7698 AND 7788
AND emp.hiredate >= to_date('1981-5-1', 'yyyy-mm-dd') AND
emp.hiredate <= to_date('2009-10-11', 'yyyy-mm-dd')
GROUP  BY emp.deptno, emp.sal
HAVING emp.deptno >= 10
ORDER  BY deptno ASC, sal ASC, 3 ASC



顯而易見和直接編寫SQL很相似,省去許多代碼量,且可讀性也高,維護也方便。



2.6、結合事務查詢的功能

以上介紹的都是沒有使用事務的功能,下面介紹結合事務的使用,先看如下代碼:

DataSet ds = new DataSet();
DbCore dbCore = new DbCore(DatabaseType.Oracle, "Password=tiger;User ID=scott;Data Source=85");

try

{

    #region 使用事務

    //--打開數據庫連接,開始使用事務

    dbCore.Open();

    dbCore.BeginTransaction();

    int intRecordCount = dbCore.DeleteFrom(EMPColumn.TableName).ExecuteNonQuery();

    ds = dbCore.SelectAll().From(EMPColumn.TableName).ExecuteDataSet();

    dbCore.RollbackTransaction();

    ds1 = dbCore.SelectAll().From(new EMP()).ExecuteDataSet();

    dbCore.Close();

    //--關閉數據庫連接,回滾結束事務

    #endregion

}

catch (Exception ex)

{

if (dbCore != null)

{

dbCore.Close();

}

    MessageBox.Show(ex.Message);

}



這里仍然是以Oracle自帶的scott用戶為例,其中的Data Source可以選擇任何Oracle的服務名。這里有必要說明的是使用了打開、關閉數據庫連接,因為要使用事務所以需要先打開數據庫連接,前文介紹的都是沒有使用事務的,所以該步驟可略過。該例的功能是先刪除EMP表的所有數據再查詢該表的所以信息,可見再當前事務下是沒有任何信息的,然后在回滾事務,再查詢就又有數據了,這正是事務所起的作用。同時需要注意的是,數據庫連接打開后要關閉,且當中間出現異常時也關閉已打開的數據庫連接,以釋放資源。



3、Delete刪除

仍然以Oracle自帶的scott用戶為例,并結合事務處理,先看如下代碼:

try

{
    DataSet ds = new DataSet();

    ds = dbCore.SelectAll().From(new EMP()).ExecuteDataSet();

    //--打開數據庫連接,開始使用事務

    dbCore.BeginTransaction();



    EMP entity = new EMP();

    entity.EMPNO = 7782;

    intRecordCount = dbCore.Delete(entity);

    ds = dbCore.SelectAll().From(EMPColumn.TableName).ExecuteDataSet();



    intRecordCount = dbCore.DeleteFrom(EMPColumn.TableName)
.Where().ConditionAndEqual(EMPColumn.DEPTNO, 10).ExecuteNonQuery();

    ds = dbCore.SelectAll().From(EMPColumn.TableName).ExecuteDataSet();



    intRecordCount = dbCore.DeleteFrom(new EMP()).ExecuteNonQuery();

    ds = dbCore.SelectAll().From(EMPColumn.TableName).ExecuteDataSet();

    dbCore.RollbackTransaction();



    ds = dbCore.SelectAll().From(EMPColumn.TableName).ExecuteDataSet();

    dbCore.Close();

    //--關閉數據庫連接,回滾結束事務

}

catch (Exception ex)

{

    if (dbCore != null) dbCore.Close();

    MessageBox.Show(ex.Message);

}



這里先聲明一個EMP雇員類的實體對象entity,并將主鍵EMPNO賦以值7782,然后執行Delete操作,即將主鍵為7782的記錄刪除之,接下來的查詢跟蹤運行可見到。關于使用實體對象插入(Insert)、更新(Update)、刪除(Delete)、保存(Save)操作可參加(上篇)或示例源代碼。下面的DeleteFrom方法,并結合Where條件,將部門編號DEPTNO等于10的雇員信息全部刪除,同樣再下面的查詢跟蹤運行可看到。最后將雇員表EMP的記錄全部刪除之,再查詢沒有任何信息。之后回滾事務,再次查詢,又可見到雇員表的所有數據信息。



4、Update更新

仍然以Oracle自帶的scott用戶為例,并結合事務處理,先看如下代碼:

DbCore dbCore = null;

try

{

    dbCore = PublicClass.GetNewDbCore();

    dbCore.Open();

    dbCore.BeginTransaction();

    EMP entity = new EMP();

    entity.EMPNO = 7499;

    entity = entity.GetEntity(dbCore);

    dbCore.Update(EMPColumn.TableName).Set(EMPColumn.SAL, entity.SAL + 100)

        .Set(EMPColumn.COMM, entity.COMM + 100) .Set(EMPColumn.HIREDATE,DateTime.Today)

        .Where().ConditionAndEqual(EMPColumn.EMPNO, 7499).ExecuteNonQuery();

    DataSet ds = dbCore.SelectAll().From(EMPColumn.TableName)

        .Where().ConditionAndEqual(EMPColumn.EMPNO, 7499).ExecuteDataSet();//查詢

    dbCore.Update(EMPColumn.TableName).Set(EMPColumn.SAL, entity.SAL)

        .Set(EMPColumn.COMM, entity.COMM) .Set(EMPColumn.HIREDATE, entity.HIREDATE)

        .Where().ConditionAndEqual(EMPColumn.EMPNO, 7499).ExecuteNonQuery();//恢復原值

    ds = dbCore.SelectAll().From(EMPColumn.TableName)

        .Where().ConditionAndEqual(EMPColumn.EMPNO, 7499).ExecuteDataSet();//查詢

    dbCore.CommitTransaction();

    dbCore.Close();

}

catch (Exception ex)

{

    if (dbCore != null)

    {

        if (dbCore.IsTransaction)

        {

            dbCore.RollbackTransaction();//如果已經開始事務,則回滾事務

        }

        dbCore.Close();

    }

    throw ex;

}



這里先聲明一個EMP雇員類的實體對象entity,并將主鍵EMPNO賦以值7499,然后執行獲取信息到對應的實體對象,查詢跟蹤運行可見到。之后分別將該員工的薪水SAL和COMM分別加100和將HIREDATE更新為今天,再查詢可見到剛剛更新的記錄數據,然后又將該員工的SAL、 COMM和HIREDATE更新恢復原值,跟蹤可見查詢的數據信息,最后提交事務,該段程序只是介紹演示之用。





2.2.4 Extend輔助擴展類

    許多工具都提供例外輔助的功能,該工具也不例外,簡要介紹如下:

1、TableHelp輔助擴展類

    以Oracle自帶的scott用戶為例,先看如下代碼:

DbCore dbCore = PublicClass.GetNewDbCore();

DataTable dt1 = dbCore.SelectAll().From(EMPColumn.TableName).ExecuteDataSet().Tables[0];

DataTable dt2 = dbCore.SelectAll().From(DEPTColumn.TableName).ExecuteDataSet().Tables[0];

DataTable dt3 = TableHelp.MergeTable(dt1, dt2, "DEPTNO");//按部門編號DEPTNO列將表dt2的數據合并到dt1

DataTable dt3_ = TableHelp.MergeTable(dt2, dt1, "DEPTNO");//按部門編號DEPTNO列將表dt1的數據合并到dt2,dt1中有多行數據對應,取首行的數據,沒有對應的數據為空

DataTable dt4 = TableHelp.AddTableRowNumCol(dt3);       //給dt3添加行號

DataTable dt5 = TableHelp.GetTableTopRows(dt4, 5);      //獲取前5行

DataTable dt6 = TableHelp.GetTableSubRows(dt4, 6, 10);  //獲取dt4從第6行到第10行

DataTable dt7 = TableHelp.GetTableSubRows(dt4, 11, 20); //獲取dt4從第11行到第20行,注:無20行取到最后一行

DataTable dt8 = TableHelp.GetTableBottomRows(dt4, 5);   //獲取dt4后5行

dt8 = TableHelp.GetTableBottomRows(dt4, 50); //獲取dt4后50行;dt4沒有后50行,從后面往前取到最前面存在行

DataTable dt9 = TableHelp.JoinInner(dt1, dt2, "DEPTNO");    //內連接

DataTable dt10 = TableHelp.JoinInner(dt1, dt2, "deptno");   //內連接

DataTable dt11 = TableHelp.JoinLeft(dt1, dt2, "DEPTNO");    //左外連接

DataTable dt12 = TableHelp.JoinRight(dt1, dt2, "DEPTNO");   //右外連接

DataTable dt13 = TableHelp.JoinLeft(dt2, dt1, "DEPTNO");    //左外連接

DataTable dt14 = TableHelp.JoinFull(dt1, dt2, "DEPTNO");    //完全外連接



DataTable dt15 = TableHelp.SortTable(dt1, "deptno", SortDirection.Asc);

DataTable dt16 = TableHelp.SortTable(dt1, "deptno");

DataTable dt17 = TableHelp.SortTable(dt1, "deptno", SortDirection.Asc,"sal",SortDirection.Asc);

DataTable dt18 = TableHelp.SortTable(dt1, "deptno","sal");

DataTable dt19 = TableHelp.SortTable(dt1, "deptno", SortDirection.Desc, "sal", SortDirection.Desc);

DataTable dt20 = TableHelp.SortTableDesc(dt1, "deptno", "sal");

DataTable dt21 = TableHelp.SortTable(dt1, "deptno", SortDirection.Asc, "sal", SortDirection.Desc);



TableHelp.DataTableToExcel(dt1, @"C:/Documents and Settings/楚濤/桌面/temp1.xls");

DataSet ds = new DataSet();

DataTable dt22 = dt1.Copy();

//修改表名,DataTable默認TableName="Table",DataSet集合的DataTable.TableName不能同名

dt22.TableName = "EMP";

DataTable dt23 = dt2.Copy();

//修改表名,DataTable默認TableName="Table",DataSet集合的DataTable.TableName不能同名

dt23.TableName = "DEPT";

ds.Tables.Add(dt22);

ds.Tables.Add(dt23);

TableHelp.DataSetToExcel(ds, @"C:/Documents and Settings/楚濤/桌面/temp2.xls");



TableHelp輔助擴展類,提供合并DataTable數據表、獲取數據表指定行的數據、內連接、左外連接、右外連接、完全外連接、對數據表排序、將數據表DataTable或數據集DataSet輸出到Excel文件等,可見上述程序代碼的釋義說明文字。

同時也提供通過過濾條件選擇DataTable行、合并數據表行信息、轉換數據表列值對并以DataTable的形式返回的常用方法,如下所示:

DataTable dt24 = TableHelp.GetTableSelect(dt1, "deptno=10");//選取deptno=10的所有信息,并以DataTable的形式返回

DataTable dt25 = TableHelp.GetTableSelect(dt1, "deptno=20");//選取deptno=20的所有信息,并以DataTable的形式返回

DataTable dt26 = TableHelp.TableAppend(dt24, dt25);//將dt23數據按行附加到dt22,并以新的結果數據表的形式返回

string[,] strArray = new string[1, 2];

strArray[0, 0] = "SCOTT";

strArray[0, 1] = "scott/tiger";

DataTable dt27 = TableHelp.ReplacleTableColValue(dt26, "ename", strArray);



MergeTable和TableAppend區別是,前者是橫向合并,即列的合并;后者是縱向合并,即行的合并。ReplacleTableColValue功能既是如字面意思所示替換Table列值,沒有匹配的保留原值,功能類似Oracle的decode函數。



2、CommonHelp常用方法擴展類

CommonHelp提供了許多常用方法,如財務上人民幣金額大寫的轉換、字符串中中文的檢查、唯一隨機數字固定長度為20的數字字符串的產生、HTML代碼和對應格式化的字符串的相互轉化、整型和浮點型數字字符串檢查、Email地址和日期時間格式字符串的檢查、獲得中文字符串的漢語拼音碼首字母等常用功能,可見以下示例:

string str1 = CommonHelp.NumberToRMB(1);        //"壹元整"

str1 = CommonHelp.NumberToRMB(1);               //"壹元整"

str1 = CommonHelp.NumberToRMB(102);             //"壹佰零貳元整"

str1 = CommonHelp.NumberToRMB(10023);           //"壹萬零貳拾叁元整"

str1 = CommonHelp.NumberToRMB(1000234);         //"壹佰萬零貳佰叁拾肆元整"

str1 = CommonHelp.NumberToRMB(10002345);        //"壹仟萬零貳仟叁佰肆拾伍元整"

str1 = CommonHelp.NumberToRMB(1000023456);      //"壹拾億零貳萬叁仟肆佰伍拾陸元整"

str1 = CommonHelp.NumberToRMB(100000234567);    //"壹仟億零貳拾叁萬肆仟伍佰陸拾柒元整"

str1 = CommonHelp.NumberToRMB(12345678901);     //"壹佰貳拾叁億肆仟伍佰陸拾柒萬捌仟玖佰零壹元整"

str1 = CommonHelp.NumberToRMB(123456789012);    //"壹仟貳佰叁拾肆億伍仟陸佰柒拾捌萬玖仟零壹拾貳元整"

str1 = CommonHelp.NumberToRMB(1234567890123);   //"壹萬貳仟叁佰肆拾伍億陸仟柒佰捌拾玖萬零壹佰貳拾叁元整"

str1 = CommonHelp.NumberToRMB(1234567890123.4M);//"壹萬貳仟叁佰肆拾伍億陸仟柒佰捌拾玖萬零壹佰貳拾叁元肆角整"

decimal dec = 1234007890123.45M;

str1 = CommonHelp.NumberToRMB(dec);             //"壹萬貳仟叁佰肆拾億零柒佰捌拾玖萬零壹佰貳拾叁元肆角伍分"

string str = string.Empty;

for (int i = 0; i < 1000; i++)

{

    str += CommonHelp.GetOnlyRandomID() + "/r/n";//唯一隨機數字固定長度為20的數字字符串

}

MessageBox.Show(str);

string str1 = "abcdEFGH";

bool isHasChinese = CommonHelp.IsHasChineseWord(str1); //false不含有中文字符

str1 = "abcd啊EFGH";

isHasChinese = CommonHelp.IsHasChineseWord(str1); //true含有中文字符

string str2 = "<input type=/"button/" value=/"button/"><input type=/"image/" >";

string str3 = CommonHelp.HTML_CodeToString(str2);//Html代碼和對應格式化的字符串的相互轉化

string str4 = CommonHelp.StringToHTML_Code(str2);//Html代碼和對應格式化的字符串的相互轉化

string str5 = CommonHelp.HTML_CodeToString(str3);//Html代碼和對應格式化的字符串的相互轉化





還有其他常用方法和加密/解密常用方法擴展類CryptographyHelp、OfficeHelp常用方法輔助擴展類等就不在此一一列舉了。





3 結束語
以上就是C#.Net實體代碼生成工具(EntitysCodeGenerate)對ORM實現及使用過程和實體(集)代碼的批量生成及各種數據庫訪問的統一操作的簡單介紹,詳細可見示例代碼及工具幫助文檔。使用該工具的還一個好處就是,當項目需要切換數據庫或使用不同的數據庫時,只須適當調整,修改數據庫類型連接即可。工具安裝后附帶大量的示例代碼,里面會有更多的示例代碼和chm格式的幫助文檔。使用工具建立表之前建議:數據看表名及字段名最好都大寫,且表名及字段名首字符最好以大寫英文字母開頭且不能含有'┋'字符。另外文字命名約定俗成為單數形式,這樣做的目的可以使數據庫結構更規范化,同時也是因為許多數據庫都是英文字母開頭的且不能含特殊字符,如Oracle就是這樣,且表名和字段名都是大寫,長度不要超過30個字符且命名過長也無意義,多出的信息可以在命名注釋里多寫些注釋信息。表字段名最好不要這樣FIELD1,2,3...以數字順序結尾,因為這樣容易與Oledb、Odbc參數機制沖突,導致跨數據庫訪問時帶來有些不必要的麻煩,且這樣命名也不是好的規范,必要時可以是FIELDA,B,C...。每個表都應當主鍵,可以是聯合主鍵。若沒有主鍵,則在有些地方使用主鍵判斷記錄的唯一性時須指定替代字段。

當前網上也有許多類似的.net代碼生成工具,但每個工具總缺少某個功能,比如:屬性字段缺少注釋的提取、數據類型之間的映射死板、不穩定、生成代碼的規范、代碼修改困難、復雜數據訪問及性能問題或內部配置文件復雜報錯(如老安全風險用的工具查找當前環節查評任務異常)或其它使用問題等等。該工具很好的解決了這些問題,并結合公司多年具體項目的需求,可以像抽屜一樣單獨使用或分開或相互結合使用,也可和其它組件并行使用,如可以動態得從公司平臺或其它工具中讀取數據庫參數而不必寫死在文件里,這樣若要實現對用戶數據庫連接信息加密/解密也很好處理。

理論的實現總是從簡單到復雜,覆蓋所有可能,實際應用就需要結合實際從復雜到簡單,化復雜為簡單,凡是要將復雜的東西以簡單的方式解決為好。就如模型思想提出時需要從眾多實踐中總結出來,再升華并須得到全面的驗證,而模型應用則要結合具體實際,拿來適當的從簡應用,回歸到實踐。

軟件開發都希望從大量重復繁重的代碼中解放出來,縮短工期并提高項目的質量,同時當需要的時候可以準確的將絕大多數后臺代碼快速完成,并便于維護,這些就需要適當借助工具和方法為開發和交流維護提供良好的保障。

由于考慮的欠缺及水平的有限,可能還存在一些不足,有待進一步完善,歡迎交流批評斧正!Thanks!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻豆一二区 | 欧美一级片 在线播放 | 成人在线免费视频播放 | 日本黄色一级毛片 | 成人午夜免费看 | 大学生一级毛片在线视频 | 18欧美性xxxx极品hd | 成人午夜免费观看 | 精品成人网 | 国产精品一区二av18款 | 欧美高清第一页 | 国产午夜三级一区二区三桃花影视 | 超碰97人人艹 | 今井夏帆av一区二区 | 成人午夜一区二区 | 一级毛片在线免费观看 | 亚洲国产精品久久久久久久久久 | 黄网站在线观 | 国产三级三级三级三级 | 久久激情小视频 | 欧美aaaaaaaa| 91精品国产一区二区三区四区在线 | 成人在线视频黄色 | 成人在线视频国产 | 亚洲视频成人 | 青青草免费观看完整版高清 | 国产69久久精品成人看 | h视频在线观看免费 | 免费国产羞羞网站视频 | 国产91免费看 | 日本韩国欧美一级片 | 国产毛片毛片毛片 | 福利在线免费视频 | 免费一级片网站 | 久久精品网 | 欧美综合在线观看 | 女人久久久www免费人成看片 | 国产91丝袜在线播放0 | av免费大全 | jizzjizzjizz少妇 | 国产精品免费视频观看 |