第一步:在Web应用程序或WinForm应用程序下添加App_Data/T-SQL文件夹, 然后在上面创建的文件夹下创建Holistic.xml文件。
Holistic.xml的格式如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<Holistic xmlns="http://dataaccessor.codeplex.com/xsd/holistic">
  <Database Name="Northwind"
            ConnectionString="server=.; database=northwind; user id=sa; password=sa;"
            DataAccessor="DataAccessor.SqlServer2008,DataAccessor">
    <Config Name="Employees" FilePath="Northwind/Employees.xml"/>
  </Database>
</Holistic>

通过设置Holistic根节点的xmlns="http://dataaccessor.codeplex.com/xsd/holistic",可以在VS中启用代码的智能感知。

每个Database节点对应一个数据库连接,在该节点的Attributes中定义了连接的名称(Name)、连接字符串(ConnectionString)和为执行本连接中配置的SQL语句需要用到的IDataAccessor的实现(DataAccessor)。如果您的项目需要连接各种不同的数据库则可以通过创建多个Database节点来实现。如果在Holistic中定义了多个Name相同的Database节点,则只有第一个有效。

每个Config节点对应一个T-SQL配置文件,在该节点中定义了节点名称(Name)、T-SQL配置文件的路径(FilePath)。当需要执行SQL语句时,将会解析T-SQL配置文件。每个Database节点可以包括多个Config节点。如果在同一个Database节点中定义了多个Name相同的Config节点,则只有第一个有效。

Config节点中指定的FilePath是相对于Holistic.xml文件的路径。

第二步:创建Config中指定的T-SQL文件。T-SQL文件的格式如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<TSQL xmlns="http://dataaccessor.codeplex.com/xsd/T-SQL">
  <Statement Name="Create an employee">
    <Command Type="Text" Timeout="30">
      <![CDATA[
      INSERT INTO Employees  VALUES (@LastName,@FirstName,@Title,@TitleOfCourtesy,@BirthDate,@HireDate,@Address,@City,@Region,@PostalCode,@Country,@HomePhone,@Extension,@Photo,@Notes,@ReportsTo,@PhotoPath);
      ]]>
    </Command>
    <Params>
      <Param Name="@LastName" DataType="AnsiString" Length="20"/>
      <Param Name="@FirstName" DataType="AnsiString" Length="10"/>
      <Param Name="@Title" DataType="AnsiString" Length="30"/>
      <Param Name="@TitleOfCourtesy" DataType="AnsiString" Length="25"/>
      <Param Name="@BirthDate" DataType="DateTime" Length="0"/>
      <Param Name="@HireDate" DataType="DateTime" Length="0"/>
      <Param Name="@Address" DataType="AnsiString" Length="60"/>
      <Param Name="@City" DataType="AnsiString" Length="15"/>
      <Param Name="@Region" DataType="AnsiString" Length="15"/>
      <Param Name="@PostalCode" DataType="AnsiString" Length="10"/>
      <Param Name="@Country" DataType="AnsiString" Length="15"/>
      <Param Name="@HomePhone" DataType="AnsiString" Length="24"/>
      <Param Name="@Extension" DataType="AnsiString" Length="4"/>
      <Param Name="@Photo" DataType="Binary" Length="0"/>
      <Param Name="@Notes" DataType="AnsiString" Length="0"/>
      <Param Name="@ReportsTo" DataType="Int32" Length="0"/>
      <Param Name="@PhotoPath" DataType="AnsiString" Length="255"/>
    </Params>
  </Statement>

  <Statement Name="Get all employees">
    <Command Type="Text" Timeout="30">
      <![CDATA[
      select * from Employees;
      ]]>
    </Command>
  </Statement>

  <Statement Name="Delete an employee">
    <Command Type="Text" Timeout="30">
      <![CDATA[
      delete from Employees where LastName=@LastName and FirstName=@FirstName;
      ]]>
    </Command>
    <Params>
      <Param Name="@LastName" DataType="AnsiString" Length="20"/>
      <Param Name="@FirstName" DataType="AnsiString" Length="10"/>
    </Params>
  </Statement>
</TSQL>

T-SQL配置文件的根节点为TSQL,通过声明xmlns="http://dataaccessor.codeplex.com/xsd/T-SQL"可以获取到代码的智能感知。
TSQL节点下包含多个Statement节点。Statement节点仅有一个Name属性,用来唯一标识该配置节点。。
/TSQL/Statement/Command节点用来声明SQL语句,该节点有Type和Timeout两个属性。Type属性定义了命令的类型,可能有Text和StoredProcedure,分别表示将要执行的命令是SQL语句还是存储过程;Timeout用来指定执行该命令的超时时间,单位为分钟,该值会在构建Command时赋给CommandTimeout属性。该配置节内的数据声明为CData类型,其写法与在DBMS中的写法相同,不再赘述。
/TSQL/Statement/Command/Params节点用来声明语句的参数,该节点有Name,DataType,Length和Input四个属性,分别表述如下:
Name:参数的名称,和语句中声明的参数名称一致。
DataType:参数的数据类型,其约束定义如下:
  <xs:simpleType name="ParameterDataTypeRestriction">
    <xs:restriction base="xs:string">
      <xs:enumeration value="AnsiString"/>
      <xs:enumeration value="Binary"/>
      <xs:enumeration value="Byte"/>
      <xs:enumeration value="Boolean"/>
      <xs:enumeration value="Currency"/>
      <xs:enumeration value="Date"/>
      <xs:enumeration value="DateTime"/>
      <xs:enumeration value="Decimal"/>
      <xs:enumeration value="Double"/>
      <xs:enumeration value="Guid"/>
      <xs:enumeration value="Int16"/>
      <xs:enumeration value="Int32"/>
      <xs:enumeration value="Int64"/>
      <xs:enumeration value="Object"/>
      <xs:enumeration value="SByte"/>
      <xs:enumeration value="Single"/>
      <xs:enumeration value="String"/>
      <xs:enumeration value="Time"/>
      <xs:enumeration value="UInt16"/>
      <xs:enumeration value="UInt32"/>
      <xs:enumeration value="UInt64"/>
      <xs:enumeration value="VarNumeric"/>
      <xs:enumeration value="AnsiStringFixedLength"/>
      <xs:enumeration value="StringFixedLength"/>
      <xs:enumeration value="Xml"/>
      <xs:enumeration value="DateTime2"/>
      <xs:enumeration value="DateTimeOffset"/>
    </xs:restriction>
  </xs:simpleType>

Length:参数的长度,一般写为相应字段的长度,默认为0.
Direction:参数的方向。取值范围有Input和Output.

第三步:在代码中创建一个IDataAccessor的实例。本项目提供了一个Factory用来创建IDataAccessor的实例,如下所示:
public IDataAccessor DA = Factory.Creater("Northwind", "Employees");
第一个参数用来指定用Holistic.xml中哪个Database的声明来创建IDataAccessor的实例。
第二个参数用来指定该IDataAccessor的实现将从哪个Config对应的文件中获取SQL语句。
如果您只有一个Database节点或者想在所有Database节点中的Config节点获取SQL语句,则可以不指定第二个参数,例如:
public IDataAccessor DA = Factory.Creater("Northwind");

然后,您就可以通过如下方式来执行SQL语句了:
private void LoadEmployees()
{
    var employeesTable = DA.ExecuteDataSet("Get all employees").Tables[0];
    this.gridEmployees.DataSource = employeesTable;
}

如果语句中有参数,您可以通过如下方式执行:
            DA.ExecuteNonQuery("Insert a employee",
                this.txtFirstName.Text,
                this.txtLastName.Text,
                this.txtTitle.Text,
                this.comboTitleOfCourtesy.Text,
                this.dpickerBirthDate.Value,
                this.dpickerHireDate.Value,
                this.txtAddress.Text,
                this.txtCity.Text,
                this.txtRegion.Text,
                this.txtPostalCode.Text,
                this.txtCountry.Text,
                this.txtHomePhone.Text,
                this.txtExtension.Text,
                photoBytes,
                this.richNotes.Text,
                this.comboReportsTo.Text,
                this.picPhoto.ImageLocation);

这种用法参数的顺序必须和Params节点中定义的顺序一致。当然,您也可以把参数组织为Dictionary,这样就没有顺序的要求了。

以上的实例代码您可以在源码中找到,源码的下载地址如下:http://dataaccessor.codeplex.com/SourceControl/list/changesets

Last edited May 23, 2012 at 7:12 AM by zhangwei03020915, version 4

Comments

No comments yet.