1. 程式人生 > 其它 >(PDF.NET框架例項講解)將儲存過程對映為實體類

(PDF.NET框架例項講解)將儲存過程對映為實體類

PDF.NET資料開發框架可以將表,檢視,表值函式,自定義的查詢語句和儲存過程對映為實體類,在上一篇《(PDF.NET框架例項講解)將任意複雜的SQL查詢對映成實體類 》已經講解了自定義查詢的實體類對映方法,今天來講講儲存過程的對映操作。

1,使用程式碼工具,生成實體類程式碼

具體過程跟“上一篇”文章中的步驟1-4一樣,請參見原文。

注意為了獲得儲存過程的表架構,需要在下圖的視窗中輸入類似的程式碼:

exec 儲存過程名稱 引數值1,引數值2

這裡我們輸入

exec GetExcellentDetails 'A',3

查詢名稱和實體類名稱都輸入為“InvestmentSolutionData”,在我們的Model專案下面將會生成一個檔案 InvestmentSolutionData.cs

2,修改剛才生成的實體類檔案,設定“對映為儲存過程”:

public partial class InvestmentSolutionData : EntityBase
  {
    public InvestmentSolutionData()
    {
            TableName = "WStModel.Entitys.InvestmentSolutionData";
            EntityMap=EntityMapType.StoredProcedure;
            //IdentityName = "標識欄位名";
            //PrimaryKeys.Add("主鍵欄位名");
         
    }
//其它屬性略
}

也就是這一句:EntityMap=EntityMapType.StoredProcedure

3,修改剛才生成的實體查詢配置檔案 EntitySqlMap.config

修改前:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <Namespace name="DemoNameSpace">
    <Map name="DemoSqlName">
      <Sql><![CDATA[ select * from table ]]></Sql>
    </Map>
  </Namespace>
  <Namespace name="WStModel.Entitys">
    <Map name="InvestmentSolutionData">
      <Sql>
        <![CDATA[
     exec GetExcellentDetails 'A',3
     ]]></Sql>
    </Map>
  </Namespace>
</configuration>

 修改後:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <Namespace name="DemoNameSpace">
    <Map name="DemoSqlName">
      <Sql><![CDATA[ select * from table ]]></Sql>
    </Map>
  </Namespace>
  <Namespace name="WStModel.Entitys">
    <Map name="InvestmentSolutionData">
      <Sql>
        <![CDATA[
      GetExcellentDetails 
      #solution:String,String,2#,
      #yield:Int32#
]]></Sql>
    </Map>
  </Namespace>
</configuration>

因為儲存過程 GetExcellentDetails  有兩個引數,所以需要在這裡顯式的指明,引數solution 是varchar(2)型別,引數yield 是int 型別,按照SQL-MAP的語法規則(參見《PDF.NET(PWMIS資料開發框架)之SQL-MAP目標和規範 》),改寫成上面的樣子。(注:之所以要用該語法,是為了遮蔽具體資料庫的差異) 

4,編寫程式碼,使用“儲存過程”實體類

使用“儲存過程”實體類跟使用其它型別的實體類比較類似,但儲存過程可能有引數,所以需要初始化引數值,例項程式碼如下所示:

public IEnumerable<IInvestmentSolutionData> GetSolutionData(string solutionName,int period)
        {
            //InvestmentSolutionData 為儲存過程實體類
            InvestmentSolutionData entity = new InvestmentSolutionData();
            OQL q = new OQL(entity);
            q.InitParameters = new Dictionary<string, object>();
            q.InitParameters.Add("solution", solutionName);
            q.InitParameters.Add("yield", period);
            //執行查詢
            q.Select();
            List<InvestmentSolutionData> list = EntityQuery<InvestmentSolutionData>.QueryList(q);
            return list;
        }

上面的例子中,呼叫了OQL物件的InitParameters 屬性,初始化實體類查詢需要的值。

目前,PDF.NET的程式碼生成器還不能自動生成以上程式碼,如果要“享受自動生成程式碼”的過程,則需要使用框架的“SQL-MAP”技術,參見《抽象SQL(引數化)查詢 》一文。不過使用本文介紹的“儲存過程”實體類對映技術,在使用方式上更靈活,至少你不用單獨去生成一個DAL層了。

注:本文所說的功能需要在PDF.NET 4.1以上支援,PDF.NET本身僅需要.net 2.0支援,框架的最新版本沒有公開發布,但已經有不少使用者正在專案裡面使用,有關框架的詳細資訊請看官網介紹: http://www.pwmis.com/sqlmap