在這個函數的參數是對象列表和要插入的數據庫表名稱。在函數中首先是遍歷應用程序對象列表,對每一個對象調用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();
}