程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第十二講 基於反射和動態編譯的快速ORM框架(上)(10)

C#發現之旅第十二講 基於反射和動態編譯的快速ORM框架(上)(10)

編輯:關於C語言

從這個函數可以看 出,快速ORM框架處理的實體類型必須是一個類型,必須公開,不得是抽象的,而且有公開的 無參數的構造函數。這裡使用了.Net框架的反射技術,首先使用Type.GetConstructor函數獲 得對象類型指定樣式的構造函數對象,還使用GetProperties函數獲得實體類型的所有的公開 實例屬性。若屬性附加了BindFIEldAttribute特性則添加到輸出列表中。注意,屬性的數據 類型必須是CLR基礎數據類型,字符串或者時間日期格式,其他的數據類型是不合要求的。

這裡還調用了一個GetBindFIEldName獲得屬性綁定的數據庫字段名,其代碼為

private string GetBindFIEldName( System.Reflection.PropertyInfo  p )
{
     BindFieldAttribute fa = ( BindFIEldAttribute )  Attribute.GetCustomAttribute(
         p , typeof(  BindFIEldAttribute ));
     string name = fa.Name ;
      if( name != null )
         name = name.Trim();
      if( name == null || name.Length == 0 )
         name =  p.Name ;
     return name ;
}

其功能很簡單,就是 檢查屬性是否附加了BindFIEldAttribute特性,若附加了則使用該特性的Name值,若沒有則 直接返回屬性的名稱。

生成插入數據的代碼

基礎類型RecordORMHelper預留了 FillInsertCommand函數,該函數就是為插入數據庫記錄而設置數據庫命令對象(IDbCommand) 的。對於DB_Employees,其代碼為

public override int  FillInsertCommand( System.Data.IDbCommand cmd , object objRecord )
{
     if( cmd == null ) throw new ArgumentNullException ("cmd");
     if( objRecord == null ) throw new  ArgumentNullException("objRecord");
     MyORM.DB_Employees myRecord  = objRecord as MyORM.DB_Employees ;
     if( myRecord == null )  throw new ArgumentException("must type 'MyORM.DB_Employees' ");

     System.Collections.ArrayList myFIEldNames = new  System.Collections.ArrayList();
     System.Collections.ArrayList  myValues = new System.Collections.ArrayList();

      myFIEldNames.Add( "EmployeeID" );
     myValues.Add(  myRecord.EmployeeID );

     if( myRecord.LastName != null )
     {
         myFIEldNames.Add( "LastName" );
         myValues.Add( myRecord.LastName );
     }

     myFIEldNames.Add( "BirthDate" );
     myValues.Add(  myRecord.BirthDate.ToString("yyyy-MM-dd") );

處理其他屬性值 ……

     myFIEldNames.Add( "Sex" );
      myValues.Add( myRecord.Sex );

     if( myFIEldNames.Count  == 0 ) return 0 ;
     cmd.Parameters.Clear() ;
      System.Text.StringBuilder MySQL = new System.Text.StringBuilder();
       MySQL.Append( "Insert Into Employees ( " );
     MySQL.Append(  ConcatStrings( myFIEldNames ));
     MySQL.Append( " ) Values (  " );
     for( int iCount = 0 ; iCount < myValues.Count ;  iCount ++ )
     {
         if( iCount > 0 )  MySQL.Append(" , " );
         MySQL.Append(" ? ") ;
          System.Data.IDbDataParameter parameter = cmd.CreateParameter ();
         parameter.Value = myValues[ iCount ] ;
          cmd.Parameters.Add( parameter );
     }//for
      MySQL.Append( " ) " );
     cmd.CommandText =  MySQL.ToString();
     return myValues.Count ;
}

在 這段代碼中,首先是檢查參數是否正確。然後處理實體類型的所有的屬性。若屬性值等於默 認值則跳過處理,否則將屬性綁定的字段的名稱保存到myFieldNames列表中,屬性值保存到 myValues列表中。最後使用字符串拼湊的操作來生成SQL命令文本,若NamedParameter屬性為 Ture,則生成的SQL文本為“Insert Into TableName  ( FieldName1 , FieldName2 … ) Values ( @Value1 , @Value2 …)”,若該屬性為False,則生成的 SQL文本為“Insert Into TableName  ( FieldName1 , FIEldName2 … ) Values ( ? , ? …)”,並將屬性值添加到數據庫命令對象的參數列表中,該 函數返回保存數據的屬性的個數。

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