程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第十二講 基於反射和動態編譯的快速ORM框架(下)(4)

C#發現之旅第十二講 基於反射和動態編譯的快速ORM框架(下)(4)

編輯:關於C語言

在這段代碼中,首先是遍歷實體類型中所 有的綁定到字段的屬性,根據其附加的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。

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