前面幾篇文章講到了如何使用框架進行簡單結構的增刪改查操作,由於個人能力有限在對於複雜的SQL操作面前也是無能為力,只能自己動手來寫SQL語句。在Git.Framework中提供了一個公共的介面來直接操作SQL語句。
一. SQL配置檔案的結構簡介
在這個框架中提供了單獨的配置檔案用於來管理SQL語句,當然也可以不用配置檔案。使用SQL配置檔案系統在啟動的時候會直接將SQL配置檔案轉化為Command物件快取,而不用後期再去建立,這是一個比較不錯的優勢。下面先看看SQL配置檔案的結構
<dataOperations> <dataCommand name="User.UpdateAllBase" database="JooShowGit" commandType="Text"> <commandText> <![CDATA[ SQL語句 ]]> </commandText> <parameters> <param name="@UserId" dbType="Int32" direction="Input"/> </parameters> </dataCommand> </dataOperations>
上面的程式碼是一個簡單的結構模式,dataOperations 是根節點,下面可以包含多個dataCommand節點。而在commandText中可以配置任意的SQL語句。在框架中建議使用佔位符引數來代替輸入引數和輸出引數,而節點parameters 節點就是用於來配置佔位符引數的,如果SQL語句中沒有佔位符引數則可以不用配置param節點(parameters節點下面沒有子節點了)。
dataCommand的屬性name在所有的SQL配置檔案中是唯一的,這裡有個非常不好的就是不能自動盤點節點名稱是否已經存在了。 database則是指定資料庫連線name 。
commandType則是指定SQL語句的型別,包括三個值: Text,StoredProcedure,TableDirect 具體什麼含義ADO.NET的都知道。
Param的具體配置項如下:
name: 佔位符名稱,這裡要注意@+名稱 , 在MySQL或者Oracle中可能稍有不同
dbType: 用於指定佔位符輸入引數型別,具體可以賦值內容如下:
<xs:enumeration value="AnsiString" /> <xs:enumeration value="Binary" /> <xs:enumeration value="Boolean" /> <xs:enumeration value="Byte" /> <xs:enumeration value="Currency" /> <xs:enumeration value="Date" /> <xs:enumeration value="DateTime" /> <xs:enumeration value="Decimal" /> <xs:enumeration value="Double" /> <xs:enumeration value="Int16" /> <xs:enumeration value="Int32" /> <xs:enumeration value="Int64" /> <xs:enumeration value="SByte" /> <xs:enumeration value="Single" /> <xs:enumeration value="String" /> <xs:enumeration value="StringFixedLength" /> <xs:enumeration value="AnsiStringFixedLength" /> <xs:enumeration value="Time" /> <xs:enumeration value="UInt16" /> <xs:enumeration value="UInt32" /> <xs:enumeration value="UInt64" /> <xs:enumeration value="VarNumeric" /> <xs:enumeration value="Xml" />
direction 則是佔位符引數型別,在ADO.NET中有輸入引數,輸出引數,輸入輸出引數等,在這裡也提供了相應的對映對應關係,具體可賦值內容如下:
<xs:enumeration value="Input" /> <xs:enumeration value="InputOutput" /> <xs:enumeration value="Output" /> <xs:enumeration value="ReturnValue" />
一個這樣的配置檔案中可以配置多個節點,唯一要注意的就是name的名稱不能一樣,否則會報錯。我們可以新建多個這樣的配置檔案。看一個簡單的案例配置
<?xml version="1.0" encoding="utf-8" ?> <dataOperations> <!--User_Base所有欄位的修改--> <dataCommand name="User.UpdateAllBase" database="JooShowGit" commandType="Text"> <commandText> <![CDATA[ UPDATE [User] SET [UserName] = @UserName ,[Email] = @Email ,[Password] = @Password ,[RegisterDate] = @RegisterDate ,[RegisterIp] = @RegisterIp ,[Status] = @Status ,[RegisterApplicationID] = @RegisterApplicationID ,[ActiveDate] = @ActiveDate ,[LastLoginDate] = @LastLoginDate ,[LastLoginApplicationID] = @LastLoginApplicationID ,[RegisterSource] = @RegisterSource ,[AuditStatus] = @AuditStatus ,[IsLogin] = @IsLogin ,[LoginCount] = @LoginCount ,[LastLoginIp] = @LastLoginIp ,[AuditUser] = @AuditUser ,[AuditDate] = @AuditDate ,[IsDeleted] = @IsDeleted ,[OLDApplicationID] = @OLDApplicationID ,[OLDID] = @OLDID ,[RowGuid] = @RowGuid ,[IMNum] = @IMNum ,[Phone] = @Phone ,[IsEmailValidate] = @IsEmailValidate ,[IsPhoneValidate] = @IsPhoneValidate ,[StepNum] = @StepNum ,[SaleCode]=@SaleCode ,[PasswordIM]=PasswordIM ,[ActiveIP]=@ActiveIP ,[CompanyType]=@CompanyType Where UserId=@UserId ]]> </commandText> <parameters> <param name="@UserId" dbType="Int32" direction="Input"/> <param name="@UserName" dbType="String" direction="Input"/> <param name="@Email" dbType="String" direction="Input"/> <param name="@Password" dbType="String" direction="Input"/> <param name="@RegisterDate" dbType="DateTime" direction="Input"/> <param name="@RegisterIp" dbType="String" direction="Input"/> <param name="@Status" dbType="Int32" direction="Input"/> <param name="@RegisterApplicationID" dbType="Int32" direction="Input"/> <param name="@ActiveDate" dbType="DateTime" direction="Input"/> <param name="@LastLoginDate" dbType="DateTime" direction="Input"/> <param name="@LastLoginApplicationID" dbType="Int32" direction="Input"/> <param name="@RegisterSource" dbType="Int32" direction="Input"/> <param name="@AuditStatus" dbType="Int32" direction="Input"/> <param name="@IsLogin" dbType="Int16" direction="Input"/> <param name="@LoginCount" dbType="Int32" direction="Input"/> <param name="@LastLoginIp" dbType="String" direction="Input"/> <param name="@AuditUser" dbType="String" direction="Input"/> <param name="@AuditDate" dbType="DateTime" direction="Input"/> <param name="@IsDeleted" dbType="Int16" direction="Input"/> <param name="@OLDApplicationID" dbType="Int32" direction="Input"/> <param name="@OLDID" dbType="Int32" direction="Input"/> <param name="@RowGuid" dbType="String" direction="Input"/> <param name="@IMNum" dbType="String" direction="Input"/> <param name="@Phone" dbType="String" direction="Input"/> <param name="@IsEmailValidate" dbType="Int32" direction="Input"/> <param name="@IsPhoneValidate" dbType="Int32" direction="Input"/> <param name="@StepNum" dbType="Int32" direction="Input"/> <param name="@SaleCode" dbType="String" direction="Input"/> <param name="@PasswordIM" dbType="String" direction="Input"/> <param name="@ActiveIP" dbType="String" direction="Input"/> <param name="@CompanyType" dbType="Int32" direction="Input"/> </parameters> </dataCommand> <dataCommand name="User.GetCount" database="JooShowGit" commandType="Text"> <commandText> <![CDATA[ SELECT COUNT(*) FROM Admin ]]> </commandText> <parameters> </parameters> </dataCommand> </dataOperations>
二. 如何管理配置檔案
在框架中如果簡單的配置以上配置檔案是不能夠被系統識別的,我們還需要將這些配置檔案統一管理起來,在系統中提供了另外一個配置檔案用於管理這些配置檔案。其結構如下:
<?xml version="1.0" encoding="utf-8" ?> <dataCommandFiles> <file name="DbVnPageRequestCommand.config"/> </dataCommandFiles>
不用驚訝,就是簡單;將SQL的配置檔案新增到配置節點dataCommandFiles中,在系統載入的時候會自動去尋找這些配置檔案,只有包含了的配置檔案才會載入讀取識別。這裡要說明一下這裡面的配置檔案都是config字尾結尾的。而管理SQL配置檔案的配置檔案的名稱為DbCommandFiles.config,如何去載入這個檔案我們需要在web.config 檔案或者app.config 檔案中去配置。
<appSettings> <add key="DatabaseListFile" value="/Configs/Data/Database.config"/> <add key="DataCommandFile" value="/Configs/Data/DbCommandFiles.config"/> </appSettings>
這個我們已經在前面講過了,必須這樣處理否則不能讀取配置檔案也不能夠連線資料庫。
三. 如何使用
在前面一系列都是講述的如何使用物件關係直接運算元據庫,這裡先看一段程式碼回顧一下內容:
IAdmin provider = new AdminDataAccess(); List<AdminEntity> listResult = provider.GetList(); Action<List<AdminEntity>> action = (items) => { if (!items.IsNullOrEmpty()) { foreach (AdminEntity item in items) { Console.WriteLine(item.UserName); } } }; action(listResult);
上面使用GetList() 查詢了表Admin中的所有資料,使用這種方式非常簡單而且實用,當時往往我們很多情況下SQL非常複雜,我們使用此種方式不能夠完成其操作,需要我們自己寫SQL語句。上面一直都是講述如何使用自定義SQL語句查詢。看看如下程式碼:
(1) 先配置一個SQL語句
<dataCommand name="User.GetALL" database="JooShowGit" commandType="Text"> <commandText> <![CDATA[ SELECT [ID] ,[UserName] ,[PassWord] ,[UserCode] ,[RealName] ,[Email] ,[Mobile] ,[Phone] ,[CreateTime] ,[CreateIp] ,[CreateUser] ,[LoginCount] ,[Picture] ,[UpdateTime] ,[IsDelete] ,[Status] ,[DepartNum] ,[ParentCode] ,[RoleNum] ,[Remark] FROM [JooShowGit].[dbo].[Admin] ]]> </commandText> <parameters> </parameters> </dataCommand>
(2)將SQL語句的配置檔案新增到D幣CommandFiles.config檔案中,上面展示過了不在貼程式碼
(3)獲取Command物件,以及執行查詢操作
IAdmin provider = new AdminDataAccess(); List<AdminEntity> listResult = provider.GetList(); Action<List<AdminEntity>> action = (items) => { if (!items.IsNullOrEmpty()) { foreach (AdminEntity item in items) { Console.WriteLine(item.UserName); } } }; action(listResult); DataCommand command = DataCommandManager.GetDataCommand("User.GetALL"); List<AdminEntity> list = command.ExecuteEntityList<AdminEntity>(); action(list);
上面的程式碼首先是得到了一個DataCommand物件,這個物件是根據xml檔案生成的,而且是在系統快取中獲取。
DataCommand command = DataCommandManager.GetDataCommand("User.GetALL");
這段程式碼會自動尋找到User.GetALL的這個配置節點,讀取其中的SQL語句
List<AdminEntity> list = command.ExecuteEntityList<AdminEntity>();
這個是系統框架的底層實現了,將讀取的資料流轉化為物件集合
修改帶引數的配置節點如下:
<dataCommand name="User.GetALL" database="JooShowGit" commandType="Text"> <commandText> <![CDATA[ SELECT [ID] ,[UserName] ,[PassWord] ,[UserCode] ,[RealName] ,[Email] ,[Mobile] ,[Phone] ,[CreateTime] ,[CreateIp] ,[CreateUser] ,[LoginCount] ,[Picture] ,[UpdateTime] ,[IsDelete] ,[Status] ,[DepartNum] ,[ParentCode] ,[RoleNum] ,[Remark] FROM [JooShowGit].[dbo].[Admin] WHERE [UserName]=@UserName ]]> </commandText> <parameters> <param name="@UserName" dbType="String" direction="Input"/> </parameters> </dataCommand>
如何傳入引數程式碼如下:
DataCommand command = DataCommandManager.GetDataCommand("User.GetALL"); command.SetParameterValue("@UserName", "administrator"); List<AdminEntity> list = command.ExecuteEntityList<AdminEntity>();
案例下載地址如下: http://pan.baidu.com/s/1o6mFO50 如果對此有興趣瞭解可以加群: 88718955