從這個函數可以看 出,快速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 ( ? , ? …)”,並將屬性值添加到數據庫命令對象的參數列表中,該 函數返回保存數據的屬性的個數。