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

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

編輯:關於C語言

在這個函數的參數是對象列表和要插入的數據庫表名稱。在函數中首先是遍歷應用程序對象列表,對每一個對象調用GetBindInfo函數獲得綁定信息,然後遍歷所有對象類型屬性綁定信息,拼湊出一個“Insert Into TableName ( 字段1,字段2 … ) Values ( 屬性值1, 屬性值2 … ) ”這樣的SQL語句,這裡使用了PropertyInfo.GetValue函數來從對象實例中獲得指定的屬性值,我們並沒有將屬性值直接放入到SQL語句中,而是采用了SQL參數的方式來存放屬性值。

SQL語句拼湊完畢後我們就設置SQL命令對象,然後執行它,這樣就向數據庫插入一條數據庫記錄了。這裡我們還使用了一個strLastSQL的變量來保存上次執行的SQL語句,這樣可以減少設置SQL命令對象的次數,提高性能。

向數據庫插入所有的對象後,我們就累計所有插入的數據庫記錄的個數為函數返回值,然後退出函數。

這個函數其過程也不復雜,我們在這個函數上面派生了一系列的向數據庫插入記錄的方法以豐富ORM框架的接口。

修改數據

框架定義了一個UpdateObjects函數用於根據應用程序對象來修改數據庫記錄,其主要代碼為

/// <summary>
/// 更新多個對象
/// </summary>
/// <param name="Objects">對象列表</param>
/// <returns>更新修改的數據庫記錄個數</returns>
public int UpdateObjects( System.Collections.IEnumerable Objects )
{
if( Objects == null )
{
throw new ArgumentNullException("Objects");
}
this.CheckBindInfo( Objects , true );
this.CheckConnetion();
int RecordCount = 0 ;
using( System.Data.IDbCommand cmd = myConnection.CreateCommand())
{
foreach( object obj in Objects ) {
TableBindInfo table = this.GetBindInfo( obj.GetType());
// 拼湊生成SQL更新語句
System.Collections.ArrayList values = new System.Collections.ArrayList();
System.Text.StringBuilder myStr = new System.Text.StringBuilder();
foreach( FieldBindInfo field in table.FIElds )
{
object v = fIEld.Property.GetValue( obj , null );
if( myStr.Length > 0 )
{
myStr.Append(" , " + System.Environment.NewLine );
}
myStr.Append( FixFieldName( field.FIEldName ) + " = ? " );
values.Add( fIEld.ToDataBase( v ));
}
myStr.Insert( 0 , "Update " + FixTableName( table.TableName ) + " Set " );
string strSQL = BuildCondition( obj , values );
myStr.Append( " Where " + strSQL );
strSQL = myStr.ToString();
// 設置SQL命令對象,填充參數
cmd.Parameters.Clear();
cmd.CommandText = strSQL ;
foreach( object v in values )
{
System.Data.IDbDataParameter p = cmd.CreateParameter();
cmd.Parameters.Add( p );
p.Value = v ;
}
RecordCount += cmd.ExecuteNonQuery();
}//foreach
}//using
return RecordCount ;
}
/// <summary>
/// 根據對象數值創建查詢條件子SQL語句
/// </summary>
/// <param name="obj">對象</param>
/// <param name="values">SQL參數值列表</param>
/// <returns>創建的SQL語句字符串</returns>
private string BuildCondition( object obj , System.Collections.ArrayList values )
{
TableBindInfo table = this.GetBindInfo( obj.GetType() );
// 拼湊查詢條件SQL語句
System.Text.StringBuilder MySQL = new System.Text.StringBuilder();
foreach( FieldBindInfo field in table.FIElds )
{
if( fIEld.Attribute.Key )
{
object v = fIEld.Property.GetValue( obj , null );
if( v == null || DBNull.Value.Equals( v ))
{
throw new Exception("關鍵字段屬性 " + fIEld.Property.Name + " 未指定值" ) ;
}
if( MySQL.Length > 0 )
{
MySQL.Append(" And " );
}
MySQL.Append( FixFieldName( field.FIEldName ));
MySQL.Append( " = ? " );
values.Add( fIEld.ToDataBase( v ));
}
}//foreach
if( MySQL.Length == 0 )
{
throw new Exception("類型 " + obj.GetType().FullName + " 未能生成查詢條件");
}
return MySQL.ToString();

}

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