Git.Framework 框架隨手記--SQL配置檔案的使用

賀臣發表於2014-05-19

  前面幾篇文章講到了如何使用框架進行簡單結構的增刪改查操作,由於個人能力有限在對於複雜的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>
SQL語句配置

    (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 

相關文章