SQL-MAP的目標:
- 集中管理SQL語句,所有SQL語句放在專門的設定檔中進行管理;
- 通過替換SQL設定檔,達到平滑切換資料庫到另外一個資料庫,比如從Oracle的應用移植到SQLSERVER;
- 由DBA來寫程式,對於複雜的查詢,DBA寫的SQL語句和預存程序更有保障更有效率,SQL-MAP工具讓DBA也能夠寫.NET程式;
- 代碼自動產生,由於在SQL設定檔中指定了很多編程特性,所以可以使用專用工具將設定檔映射到.NET代碼;
PDF.NET 資料開發架構介紹(含執行個體程式下載)請看:
http://www.pwmis.com/sqlmap
SQL-MAP代碼工具的詳細使用介紹(圖解)請看:
http://www.pwmis.com/sqlmap/toolshelp.htm
----------------------
SQL-MAP的規範:
1,通用配置:
SqlMap 配置節
EmbedAssemblySource 屬性:要將本文將嵌入的程式集名稱和資源檔名稱,格式為:
程式集名稱,預設命名空間.檔案名稱.副檔名
如果要將設定檔作為嵌入式檔案編譯,請指定該項值。該配置主要指導代碼產生器產生相應的代碼資訊。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SqlMap.xsd"
將這句話加入到這裡,可以使得SqlMap設定檔編寫的時候具有智能提示。需要在目前的目錄下有sqlmap.xsd 檔案。
2,節點類型
SQL-MAP的資料CRUD操作類型(CommandClass 的子節點類型):
Select/Read: 選取資料操作;,
Update: 更新資料操作;
Insert/Create:新增資料操作;
Delete: 刪除資料操作。
3,節點屬性:
註:<>表示必選屬性,[]表示可選屬性
<CommandName>:查詢的名字,對應於SqlMap資料實體類中的方法名;
<CommandType>:查詢命令類型,值為Text,StoredProcedure,TableDirect
[ParameterClass]:查詢參數類,在SQLMap 中表示為一個參數類;
<#ParaName[:System.Type[,System.DbType[,Size[,ParameterDirection[,Precision,Scale]]]]]#>:
ParaName:查詢語句中對應的參數名,如果名稱首碼有 @@ 標記,表示該參數是一個替換參數,將忽略後面的定義;
System.Type:可選,符合CSL規範的類型(CLT)名稱;
System.DbType:可選,符合DbType 的枚舉,如 AnsiString 等;
Size:可選,表示參數長度;
ParameterDirection:可選,表示參數的輸入輸出類型的枚舉值
Precision:可選,表示參數的資料精度,通常用於Decimal類型
Scale:可選,表示參數的資料小數位,通常用於Decimal類型
{附註:
常用CLT:Byte,Int16,Int32,Int64,Single,Double,Boolean,Char,Decimal,String
[關於一般型別系統(CLT):ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconthecommontypesystem.htm ]
[DbType 枚舉:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemDataDbTypeClassTopic.htm ]
}
<ResultClass>:Select 查詢的結果類型,
如果返回單值的查詢,請指定 為 ResultClass="ValueType";
如果返回多個行結果集,可以指定 ResultClass="DataSet",將以System.Data.DataSet的方式填充;
也可以指定 ResultClass="EntityObject",那麼將結果填充到實體類中;
或者指定 ResultClass="EntityList",那麼將結果填充到實體類列表(集合)中。
注意:Insert/Update/Delete 操作類型不需要指定該屬性。
<ResultMap>:僅僅在ResultClass="EntityObject" / "EntityList" 有效,表示實體類查詢結果映射;
通常表示返回單行(也可返回多行)記錄到一個資料實體物件的映射;
例如 要將結果集影射到一個名為 UserInfo 的自訂實體類中,注意必須使用類的全名稱:
ResultClass="EntityObject" ResultMap="MyDAL.UserInfo"
[SqlPage]:是否允許SqlMap分頁,預設是False。該屬性僅供代碼產生器使用,不過目前的代碼產生器還沒有提供這樣的功能。
開啟該屬性之後,在SqlMapDAL類的方法中,參數中需要增加一個分頁資訊數組,並且調用CommandInfo對象的SetPageInfo方法,如下面的執行個體代碼(紅色的部分為需要增加的代碼):
/// <summary>
/// 返回成交明細(帶分頁)
/// </summary>
/// <param name="WhereString">查詢條件</param>
/// <param name="pageInfo">設定分頁資訊,pageInfo[ 0]=記錄數量,pageInfo[ 1]=頁碼,pageInfo[ 2]=頁大小</param>
/// <returns></returns>
public DataSet GetTradeList(string WhereString, int[] pageInfo )
{
//擷取命令資訊
CommandInfo cmdInfo = Mapper.GetCommandInfo("GetTradeList");
//執行參數替換
cmdInfo.SetParameterValue("WhereString", WhereString, enumParamType.ReplacedText);
cmdInfo.SetPageInfo(pageinfo);
//執行查詢
return CurrentDataBase.ExecuteDataSet(CurrentDataBase.ConnectionString, cmdInfo.CommandType, cmdInfo.CommandText, null);
//
}//End Function
注意:你可以為你現有的SqlMapDAL方法增加一個重載,把這個重載的代碼放入一個部分類別檔案中,這樣就不用擔心代碼產生器的影響了。
4,版本記錄:
ver 1.0.2 修改:
支援同名參數,如果指令碼中有多個同名參數,那麼首先處理遇到的第一個參數,忽略後面的同名參數定義;
支援參數“字串替換”,用於提供構造複雜動態SQL的支援,參數名用 % % 分割,
例如 : Where #%WhereString%# 或者 Where # %WhereString% # ,系統忽略空白字元。
ver 4.0 修改:
<SqlPage>:僅僅在 SqlPage="True" 的時候,代碼產生器將產生支援分頁的DAL代碼,具體過程就是在原有參數
的最後增加一個選擇性參數 params int[] pageInfo,並在方法體中增加 cmdInfo.SetPageInfo (pageInfo ) 語句。
SQL-MAP產生工具
1,在VS的IDE中使用XSD:
根據該規範寫了一個檢查設定檔格式的XSD,檔案地址:
http://files.cnblogs.com/bluedoctor/SqlMap.xsd.xml
由於部落格園不允許上傳XSD格式的檔案,所以大家下載這個檔案以後把.xml尾碼名去掉即可。
在編寫SQL-MAP設定檔的時候,在VS2008的菜單 “XML”-〉“架構”裡面,選擇這個檔案即可。這樣編寫設定檔就可以有智能提示了。
注意:如果下載了PDF.NET整合開發工具,在工具的安裝目錄下面,也有這個sqlmap.xsd 檔案。
2,使用SQL-MAP組態管理員:
這是一個可視化的編輯程式,可以在PdfNet整合開發工具中找到,也可以在之前版本的樣本程式包中找到。
是一個SqlMap設定檔跟程式結構的:
這個圖例中,SqlMap.config 檔案在SqlMapDAL目錄下,因此將這個檔案潛入式編譯的時候,它在程式集中的全名稱是“程式集預設命名空間.SqlMapDAL.SqlMap.config” ,注意這個名字對大小寫敏感。EmbedAssemblySource的前面內容部分 “GroupStatistics.Repostitory” 是當前程式集的名稱。