程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第十一講 使用反射和特性構造自己的ORM框架(下)(1)

C#發現之旅第十一講 使用反射和特性構造自己的ORM框架(下)(1)

編輯:關於C語言

在InnerReadValue函數中遍歷所有的屬性綁定信息,調用IDataReader.GetValue函數從數據庫中獲得原始數據,然後調用FIEldBindInfo.FromDataBase函數對這個原始數據進行一些處理,主要是進行格式化和數據類型轉換,然後調用PropertyInfo.SetValue函數根據讀取的數據設置對象實例的屬性值。這樣遍歷了所有的綁定信息也就完整的填充了對象實例的屬性值。

在ReadObjects函數中,遍歷所有查詢的數據,對每個記錄創建一個對象實例,遍歷數據庫記錄完畢後,我們就將所有創建的對象實例組成一個數組作為函數返回值,然後退出函數。

我們可以在這個ReadObjects函數上面派生出一系列的從數據庫讀取對象的函數。這個ReadObjects函數就實現了框架程序讀取數據這個核心功能之一。

此外我們還定義了一個Contains函數用於判斷一個應用程序對象實例對應的數據庫記錄是否存在。

新增數據

框架程序的InsertObjects函數就能將若干個對象插入的數據庫表中。其主要代碼為

/// <summary>
/// 將若干個對象插入到數據庫中
/// </summary>
/// <param name="Objects">對象列表</param>
/// <param name="TableName">制定的數據表,若未指定則使用默認的數據表名</param>
/// <returns>插入的數據庫記錄的個數</returns>
public int InsertObjects( System.Collections.IEnumerable Objects , string TableName )
{
if( Objects == null )
{
throw new ArgumentNullException("Objects");
}
this.CheckBindInfo( Objects , false );
System.Collections.ArrayList list = new System.Collections.ArrayList();
foreach( object obj in Objects )
{
list.Add( obj );
}
if( list.Count == 0 ) {
return 0 ;
}
this.CheckConnetion();
// 上一次執行的SQL語句
string strLastSQL = null ;
int InsertCount = 0 ;
using( System.Data.IDbCommand cmd = myConnection.CreateCommand())
{
foreach( object obj in list )
{
TableBindInfo table = this.GetBindInfo( obj.GetType());
string TableName2 = TableName ;
if( TableName2 == null || TableName.Trim().Length == 0 )
{
TableName2 = table.TableName ;
}
System.Collections.ArrayList values = new System.Collections.ArrayList();
// 拼湊SQL語句
System.Text.StringBuilder myStr = new System.Text.StringBuilder();
System.Text.StringBuilder myFIElds = new System.Text.StringBuilder();
foreach( FieldBindInfo field in table.FIElds )
{
if( fIEld.Property.CanRead == false )
{
throw new Exception("屬性 " + fIEld.Property.Name + " 是不可寫的");
}
object v = fIEld.Property.GetValue( obj , null );
if( v == null || DBNull.Value.Equals( v ))
{
continue ;
}
values.Add( fIEld.ToDataBase( v ));
if( myStr.Length > 0 )
{
myStr.Append(" , ");
myFIElds.Append( " , " );
}
myStr.Append(" ? " );
myFields.Append( FixFieldName( field.FIEldName ));
}//foreach
myStr.Insert( 0 , "Insert Into " + FixTableName( TableName2 )
+ " ( " + myFIElds.ToString() + " ) Values ( " );
myStr.Append( " ) " );
string strSQL = myStr.ToString();
if( strSQL != strLastSQL )
{
// 重新設置SQL命令對象
strLastSQL = strSQL ;
cmd.Parameters.Clear();
cmd.CommandText = strSQL ;
for( int iCount = 0 ; iCount < values.Count ; iCount ++ )
{
cmd.Parameters.Add( cmd.CreateParameter());
}
}
// 填充SQL命令參數值
for( int iCount = 0 ; iCount < values.Count ; iCount ++ )
{
( ( System.Data.IDbDataParameter ) cmd.Parameters[ iCount ]).Value = values[ iCount ] ;
}
// 執行SQL命令向數據表新增記錄
InsertCount += cmd.ExecuteNonQuery();
}//foreach
}//using
return InsertCount ;
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved