在這段代碼中,首先是遍歷實體類型中所 有的綁定到字段的屬性,根據其附加的BindFIEldAttribute特性的Key值找到所有的關鍵字段 屬性對象,並創建了一個“關鍵字段名1=@Key屬性名1 And 關鍵字段名2=@Key屬性名 2”(若未啟用命名參數則為“關鍵字段名1=? And 關鍵字段名2=? ……”)格式的字符串,該字符串就是SQL語句的Where子語句了,若啟用 命名參數則生成的文本為。
若沒有找到任何關鍵屬性,則無法確定刪除記錄使用的查 詢條件,此時代碼生成器就會輸出拋出異常的代碼。在這裡代碼生成器不會直接拋出異常而 導致ORM框架過早的報警,未來可能有開發人員定義的實體類型只是為了查詢或者新增數據庫 記錄,那時不需要定義關鍵屬性。若對這種實體類型過早的報警則減少了快速ORM框架的使用 范圍。
若實體類型定義了一個或者多個關鍵屬性,則開始輸出代碼文本,首先輸出檢 查參數的代碼文本,然後遍歷所有的關鍵屬性對象,生成向數據庫命令對象添加參數的代碼 。
這裡還用到了一個WriteSetParamterValue的方法用於書寫設置參數值的過程,其 代碼為
private void WriteSetParameterValue( System.Reflection.PropertyInfo p , IndentTextWriter myWriter )
{
if (p.PropertyType.Equals(typeof(DateTime)))
{
BindFieldAttribute fa = (BindFIEldAttribute) Attribute.GetCustomAttribute(
p, typeof (BindFIEldAttribute));
if (fa.WriteFormat == null || fa.WriteFormat.Length == 0)
{
myWriter.WriteLine("parameter.Value = myRecord." + p.Name + ".ToString (\"yyyy-MM-dd HH:mm:ss\");");
}
else
{
myWriter.WriteLine ("parameter.Value = myRecord." + p.Name + ".ToString(\"" + fa.WriteFormat + "\");");
}
}
else if (p.PropertyType.Equals(typeof(string)))
{
myWriter.WriteLine("if( myRecord." + p.Name + " == null || myRecord." + p.Name + ".Length == 0 )");
myWriter.WriteLine(" parameter.Value = System.DBNull.Value ;");
myWriter.WriteLine("else");
myWriter.WriteLine(" parameter.Value = myRecord." + p.Name + " ;");
}
else
{
myWriter.WriteLine("parameter.Value = myRecord." + p.Name + " ;");
}
}
該方法內判 斷若屬性數據類型為時間型則設置輸出的數據格式,若為字符串類型,則判斷數據是否為空 ,若為空則設置參數值為DBNull。