1. 程式人生 > 其它 >使用XSD編寫具有智慧提示的XML檔案(以SQL-MAP指令碼為例項)

使用XSD編寫具有智慧提示的XML檔案(以SQL-MAP指令碼為例項)

    SQL-MAP是PDF.NET(PWMIS資料開發框架)具有特色的開發技術,它可以將SQL語句對映成DAL程式碼,而且能夠做到無需IDAL和DalFactory自動切換資料庫到另外一個數據庫系統,比如SqlServer切換到Oralcle,有關SQL-MAP的規範請看這裡,為什麼要使用這種技術,請看“抽象SQL(引數化)查詢 ”。

    從上面的規範看到,要手寫一個SQL-MAP檔案還是比較複雜,雖然框架提供了SQL-MAP配置檔案管理器,但它主要適用於新手使用,用起來效率不是很高,這個時候就需要有一個可以只能提示XML檔案編寫的東西了,這就是SqlMap.xsd,下面貼出該檔案的最新完整內容:

SqlMap.XSD 
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="enumCmdType" >
        <xs:restriction base ="xs:string">
            <xs:enumeration value ="Text"></xs:enumeration>
            <xs:enumeration value ="StoredProcedure"></xs:enumeration>
            <xs:enumeration value ="Table"></xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="enumResultClass" >
        <xs:restriction base ="xs:string">
            <xs:enumeration value ="ValueType"></xs:enumeration>
            <xs:enumeration value ="DataSet"></xs:enumeration>
            <xs:enumeration value ="EntityObject"></xs:enumeration>
            <xs:enumeration value ="EntityList"></xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="enumScriptType" >
        <xs:restriction base ="xs:string">
            <xs:enumeration value ="Access"></xs:enumeration>
            <xs:enumeration value ="SqlServer"></xs:enumeration>
            <xs:enumeration value ="SqlServerCe"></xs:enumeration>
            <xs:enumeration value ="Oracle"></xs:enumeration>
            <xs:enumeration value ="DB2"></xs:enumeration>
            <xs:enumeration value ="Sysbase"></xs:enumeration>
            <xs:enumeration value ="MySql"></xs:enumeration>
            <xs:enumeration value ="SQLite"></xs:enumeration>
            <xs:enumeration value ="PostgreSQL"></xs:enumeration>
            <xs:enumeration value ="UNKNOWN"></xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="SqlMap">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="Script">
                    <xs:complexType>
                         <xs:sequence>
                            <xs:element maxOccurs="unbounded" name="CommandClass">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:choice maxOccurs="unbounded">
                                            <xs:element maxOccurs="unbounded" name="Select">
                                                <xs:complexType>
                                                    <xs:simpleContent>
                                                        <xs:extension base="xs:string">
                                                            <xs:attribute name="CommandName" type="xs:string" use="required" />
                                                            <xs:attribute name="CommandType" type="enumCmdType" use="required" />
                                                            <xs:attribute name="Method" type="xs:string" use="required" />
                                                            <xs:attribute name="Description" type="xs:string" use="required" />
                                                            <xs:attribute name="ResultClass" type="enumResultClass" use="optional"  default="DataSet"/>
                                                            <xs:attribute name="ResultMap" type="xs:string" use="optional" />
                                                            <xs:attribute name="SqlPage" type="xs:string" use="optional" default="False"/>
                                                        </xs:extension>
                                                    </xs:simpleContent>
                                                </xs:complexType>
                                            </xs:element>
                                            <xs:element name="Insert">
                                                <xs:complexType>
                                                    <xs:simpleContent>
                                                        <xs:extension base="xs:string">
                                                            <xs:attribute name="CommandName" type="xs:string" use="required" />
                                                            <xs:attribute name="CommandType" type="enumCmdType" use="required" />
                                                            <xs:attribute name="Method" type="xs:string" use="required" />
                                                            <xs:attribute name="Description" type="xs:string" use="required" />
                                                        </xs:extension>
                                                    </xs:simpleContent>
                                                </xs:complexType>
                                            </xs:element>
                                            <xs:element name="Update">
                                                <xs:complexType>
                                                    <xs:simpleContent>
                                                        <xs:extension base="xs:string">
                                                            <xs:attribute name="CommandName" type="xs:string" use="required" />
                                                            <xs:attribute name="CommandType" type="enumCmdType" use="required" />
                                                            <xs:attribute name="Method" type="xs:string" use="required" />
                                                            <xs:attribute name="Description" type="xs:string" use="required" />
                                                        </xs:extension>
                                                    </xs:simpleContent>
                                                </xs:complexType>
                                            </xs:element>
                                            <xs:element name="Delete">
                                                <xs:complexType>
                                                    <xs:simpleContent>
                                                        <xs:extension base="xs:string">
                                                            <xs:attribute name="CommandName" type="xs:string" use="required" />
                                                            <xs:attribute name="CommandType" type="enumCmdType" use="required" />
                                                            <xs:attribute name="Method" type="xs:string" use="required" />
                                                            <xs:attribute name="Description" type="xs:string" use="required" />
                                                        </xs:extension>
                                                    </xs:simpleContent>
                                                </xs:complexType>
                                            </xs:element>
                                        </xs:choice>
                                    </xs:sequence>
                                    <xs:attribute name="Name" type="xs:string" use="required" />
                                    <xs:attribute name="Class" type="xs:string" use="required" />
                                    <xs:attribute name="Interface" type="xs:string" use="optional" />
                                    <xs:attribute name="Description" type="xs:string" use="required" />
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="Type" type="enumScriptType" use="required"  />
                        <xs:attribute name="Version" type="xs:string" use="optional" />
                        <xs:attribute name="ConnectionString" type="xs:string" use="optional" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="EmbedAssemblySource" type="xs:string" use="optional" />
        </xs:complexType>
    </xs:element>
</xs:schema>

注意檔案中的simpleType ,它表示定義一個自定義的簡單型別,在XSD檔案的節點中使用 type 屬性來引用它即可。

本文中定義了三個自定義型別enumCmdType,enumResultClass,enumScriptType ,而且是列舉型別(使用xs:enumeration 定義),這樣在XML檔案中就可以出現“下拉選擇”的提示效果了。

在節點屬性中,use="required" 表示必須的屬性,use="optional" 表示可選的屬性。

整個XSD檔案的編寫要注意的也就這麼多,編寫起來還是比較簡單的。

有了這個XSD檔案,在建立的Sql-Map配置檔案的<sqlmap> 標籤中,加入這個XSD的使用宣告,就能夠看到智慧提示的效果了。

<SqlMap  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="SqlMap.xsd">
<!-- 在下面敲入尖括號,就能夠出現當前節點區域內的應該編寫的內容,來試試吧 -->
</SqlMap>

有了這個SqlMap.config檔案,就能夠使用程式碼生成器自動生成DAL程式碼了。

PDF.NET程式碼生成器下載地址(包含框架應用的完整示例),下載後請看裡面的說明。

如果程式的資料庫無法開啟,請看看連線字串是否正確,或者將它附加到SQLSERVER例項上:

connectionString="Data Source=.SQLEXPRESS;AttachDbFilename=~App_DataPDFTest.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

下載完成後,將本文的SqlMap.xsd內容複製下來另存為檔案即可,注意檔案目錄,如果該XSD檔案跟SqlMap.config檔案不在同一個,需要修改下面的路徑:

xsi:noNamespaceSchemaLocation="SqlMap.xsd"

有關PDF.NET框架的詳細內容,請看我的部落格相關內容或者檢視官網:http://www.pwmis.com/sqlmap