本主題中的範例包含執行資料庫插入、更新和刪除作業的 DiffGrams。 使用範例之前,請注意下列事項:
如果您想要測試 DiffGram 範例,這些範例會使用必須建立的兩個數據表 (Cust 和 Ord):
Cust(CustomerID, CompanyName, ContactName) Ord(OrderID, CustomerID)本主題中的大部分範例都使用下列 XSD 架構:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> <xsd:annotation> <xsd:documentation> Diffgram Customers/Orders Schema. </xsd:documentation> <xsd:appinfo> <sql:relationship name="CustomersOrders" parent="Cust" parent-key="CustomerID" child-key="CustomerID" child="Ord"/> </xsd:appinfo> </xsd:annotation> <xsd:element name="Customer" sql:relation="Cust"> <xsd:complexType> <xsd:sequence> <xsd:element name="CompanyName" type="xsd:string"/> <xsd:element name="ContactName" type="xsd:string"/> <xsd:element name="Order" sql:relation="Ord" sql:relationship="CustomersOrders"> <xsd:complexType> <xsd:attribute name="OrderID" type="xsd:int" sql:field="OrderID"/> <xsd:attribute name="CustomerID" type="xsd:string"/> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="CustomerID" type="xsd:string" sql:field="CustomerID"/> </xsd:complexType> </xsd:element> </xsd:schema>將此架構儲存為 DiffGramSchema.xml 儲存在範例中使用的其他檔案所在的相同資料夾中。
A。 使用 DiffGram 刪除記錄
此範例中的 DiffGram 會從 Cust 資料表刪除客戶 (CustomerID 為 ALFKI) 記錄,並從 Ord 數據表刪除對應的訂單記錄 (OrderID 為 1)。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" sql:mapping-schema="DiffGramSchema.xml">
<diffgr:diffgram
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<DataInstance/>
<diffgr:before>
<Order diffgr:id="Order1"
msdata:rowOrder="0"
CustomerID="ALFKI"
OrderID="1"/>
<Customer diffgr:id="Customer1"
msdata:rowOrder="0"
CustomerID="ALFKI">
<CompanyName>Alfreds Futterkiste</CompanyName>
<ContactName>Maria Anders</ContactName>
</Customer>
</diffgr:before>
<msdata:errors/>
</diffgr:diffgram>
</ROOT>
在 <前> 一個 <區塊中,有 Order> 元素 (diffgr:id=“Order1”) 和 <Customer> 元素 (diffgr:id=“Customer1”)。 這些元素代表資料庫中的現有記錄。 <DataInstance> 元素沒有對應的記錄(具有相同的 diffgr:id)。 這表示刪除作業。
測試 DiffGram
在 tempdb 資料庫中建立這些數據表。
CREATE TABLE Cust( CustomerID nchar(5) Primary Key, CompanyName nvarchar(40) NOT NULL , ContactName nvarchar(60) NULL) GO CREATE TABLE Ord( OrderID int Primary Key, CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID)) GO新增此範例資料:
INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ALFKI', N'Alfreds Futterkiste', N'Maria Anders') INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ANATR', N'Ana Trujillo Emparedados y helados', N'Ana Trujillo') INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ANTON', N'Antonio Moreno Taquer??a', N'Antonio Moreno') INSERT INTO Ord(OrderID, CustomerID) VALUES(1, N'ALFKI') INSERT INTO Ord(OrderID, CustomerID) VALUES(2, N'ANATR') INSERT INTO Ord(OrderID, CustomerID) VALUES(3, N'ANTON')複製上述的 DiffGram,並將它貼到文字檔中。 將檔案儲存為上一個步驟中使用的相同資料夾中 MyDiffGram.xml。
複製本主題稍早提供的 DiffGramSchema,並將它貼到文本檔中。 將檔案儲存為 DiffGramSchema.xml。
建立並使用 SQLXML 4.0 測試腳本 (Sqlxml4test.vbs) 來執行 DiffGram。
如需詳細資訊,請參閱使用 ADO 執行 SQLXML 4.0 查詢。
B. 使用 DiffGram 插入記錄
在此範例中,DiffGram 會在 Cust 數據表中插入一筆記錄,並在 Ord 數據表中插入一筆記錄。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"
sql:mapping-schema="DiffGramSchema.xml">
<diffgr:diffgram
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<DataInstance>
<Customer diffgr:id="Customer1" msdata:rowOrder="0"
diffgr:hasChanges="inserted" CustomerID="ALFKI">
<CompanyName>C3Company</CompanyName>
<ContactName>C3Contact</ContactName>
<Order diffgr:id="Order1"
msdata:rowOrder="0"
diffgr:hasChanges="inserted"
CustomerID="ALFKI" OrderID="1"/>
</Customer>
</DataInstance>
</diffgr:diffgram>
</ROOT>
在此 DiffGram 中, <未指定前> 區塊 (未識別現有的資料庫記錄)。 有兩個記錄實例(由 DataInstance> 區塊中的<Customer> 和 Order 元素識別),分別對應至 Cust 和 Ord 數據表。<>< 這兩個元素都指定 diffgr:hasChanges 屬性 (hasChanges=“inserted”)。 這表示插入作業。 在此 DiffGram 中,如果您指定 hasChanges=“modified”,表示您想要修改不存在的記錄,這會導致錯誤。
測試 DiffGram
在 tempdb 資料庫中建立這些數據表。
CREATE TABLE Cust( CustomerID nchar(5) Primary Key, CompanyName nvarchar(40) NOT NULL , ContactName nvarchar(60) NULL) GO CREATE TABLE Ord( OrderID int Primary Key, CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID)) GO新增此範例資料:
INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ALFKI', N'Alfreds Futterkiste', N'Maria Anders') INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ANATR', N'Ana Trujillo Emparedados y helados', N'Ana Trujillo') INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ANTON', N'Antonio Moreno Taquer??a', N'Antonio Moreno') INSERT INTO Ord(OrderID, CustomerID) VALUES(1, N'ALFKI') INSERT INTO Ord(OrderID, CustomerID) VALUES(2, N'ANATR') INSERT INTO Ord(OrderID, CustomerID) VALUES(3, N'ANTON')複製上述的 DiffGram,並將它貼到文字檔中。 將檔案儲存為上一個步驟中使用的相同資料夾中 MyDiffGram.xml。
複製本主題稍早提供的 DiffGramSchema,並將它貼到文本檔中。 將檔案儲存為 DiffGramSchema.xml。
建立並使用 SQLXML 4.0 測試腳本 (Sqlxml4test.vbs) 來執行 DiffGram。
如需詳細資訊,請參閱使用 ADO 執行 SQLXML 4.0 查詢。
C. 使用 DiffGram 更新現有的記錄
在此範例中,DiffGram 會更新客戶 ALFKI 的客戶資訊 (CompanyName 和 ContactName)。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" sql:mapping-schema="DiffGramSchema.xml">
<diffgr:diffgram
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<DataInstance>
<Customer diffgr:id="Customer1"
msdata:rowOrder="0" diffgr:hasChanges="modified"
CustomerID="ALFKI">
<CompanyName>Bottom Dollar Markets</CompanyName>
<ContactName>Antonio Moreno</ContactName>
</Customer>
</DataInstance>
<diffgr:before>
<Customer diffgr:id="Customer1"
msdata:rowOrder="0"
CustomerID="ALFKI">
<CompanyName>Alfreds Futterkiste</CompanyName>
<ContactName>Maria Anders</ContactName>
</Customer>
</diffgr:before>
</diffgr:diffgram>
</ROOT>
<before> 區塊包含 <Customer> 元素 (diffgr:id=“Customer1”)。 <DataInstance> 區塊包含具有相同標識符的對應 <Customer> 元素。NewDataSet> 中的<customer> 元素也會指定 diffgr:hasChanges=“modified”。< 這表示更新作業,並據以更新 Cust 資料表中的客戶記錄。 請注意,如果未指定 diffgr:hasChanges 屬性,DiffGram 處理邏輯會忽略這個專案,而且不會執行任何更新。
測試 DiffGram
在 tempdb 資料庫中建立這些數據表。
CREATE TABLE Cust( CustomerID nchar(5) Primary Key, CompanyName nvarchar(40) NOT NULL , ContactName nvarchar(60) NULL) GO CREATE TABLE Ord( OrderID int Primary Key, CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID)) GO新增此範例資料:
INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ALFKI', N'Alfreds Futterkiste', N'Maria Anders') INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ANATR', N'Ana Trujillo Emparedados y helados', N'Ana Trujillo') INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ANTON', N'Antonio Moreno Taquer??a', N'Antonio Moreno') INSERT INTO Ord(OrderID, CustomerID) VALUES(1, N'ALFKI') INSERT INTO Ord(OrderID, CustomerID) VALUES(2, N'ANATR') INSERT INTO Ord(OrderID, CustomerID) VALUES(3, N'ANTON')複製上述的 DiffGram,並將它貼到文字檔中。 將檔案儲存為上一個步驟中使用的相同資料夾中 MyDiffGram.xml。
複製本主題稍早提供的 DiffGramSchema,並將它貼到文本檔中。 將檔案儲存為 DiffGramSchema.xml。
建立並使用 SQLXML 4.0 測試腳本 (Sqlxml4test.vbs) 來執行 DiffGram。
如需詳細資訊,請參閱使用 ADO 執行 SQLXML 4.0 查詢。
D. 使用 DiffGram 插入、更新和刪除記錄
在此範例中,使用相對複雜的 DiffGram 來執行插入、更新和刪除作業。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" sql:mapping-schema="DiffGramSchema.xml">
<diffgr:diffgram
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<DataInstance>
<Customer diffgr:id="Customer2" msdata:rowOrder="1"
diffgr:hasChanges="modified"
CustomerID="ANATR">
<CompanyName>Bottom Dollar Markets</CompanyName>
<ContactName>Elizabeth Lincoln</ContactName>
<Order diffgr:id="Order2" msdata:rowOrder="1"
msdata:hiddenCustomerID="ANATR"
CustomerID="ANATR" OrderID="2"/>
</Customer>
<Customer diffgr:id="Customer3" msdata:rowOrder="2"
CustomerID="ANTON">
<CompanyName>Chop-suey Chinese</CompanyName>
<ContactName>Yang Wang</ContactName>
<Order diffgr:id="Order3" msdata:rowOrder="2"
msdata:hiddenCustomerID="ANTON"
CustomerID="ANTON" OrderID="3"/>
</Customer>
<Customer diffgr:id="Customer4" msdata:rowOrder="3"
diffgr:hasChanges="inserted"
CustomerID="AROUT">
<CompanyName>Around the Horn</CompanyName>
<ContactName>Thomas Hardy</ContactName>
<Order diffgr:id="Order4" msdata:rowOrder="3"
diffgr:hasChanges="inserted"
msdata:hiddenCustomerID="AROUT"
CustomerID="AROUT" OrderID="4"/>
</Customer>
</DataInstance>
<diffgr:before>
<Order diffgr:id="Order1" msdata:rowOrder="0"
msdata:hiddenCustomerID="ALFKI"
CustomerID="ALFKI" OrderID="1"/>
<Customer diffgr:id="Customer1" msdata:rowOrder="0"
CustomerID="ALFKI">
<CompanyName>Alfreds Futterkiste</CompanyName>
<ContactName>Maria Anders</ContactName>
</Customer>
<Customer diffgr:id="Customer2" msdata:rowOrder="1"
CustomerID="ANATR">
<CompanyName>Ana Trujillo Emparedados y helados</CompanyName>
<ContactName>Ana Trujillo</ContactName>
</Customer>
</diffgr:before>
</diffgr:diffgram>
</ROOT>
DiffGram 邏輯會處理此 DiffGram,如下所示:
根據 DiffGram 處理邏輯,之前區塊對應至對應數據表的所有>最上層元素<,如對應架構中所述。
<before> 區塊具有 <Order> 元素 (dffgr:id=“Order1”) 和 <Customer> 元素 (diffgr:id=“Customer1”),其中 DataInstance> 區塊中<沒有對應的元素(具有相同標識符)。 這表示刪除作業,而且記錄會從 Cust 和 Ord 資料表中刪除。
<before> 區塊具有 <Customer> 元素 (diffgr:id=“Customer2”),其中 DataInstance> 區塊中有<對應的 <Customer> 元素(具有相同標識符)。 DataInstance> 區塊中的<元素會指定 diffgr:hasChanges=“modified”。 這是客戶 ANATR 的更新作業,其中會使用 DataInstance> 區塊中指定的<值,在 Cust 數據表中更新 CompanyName 和 ContactName 資訊。
<DataInstance> 區塊具有 <Customer> 元素 (diffgr:id=“Customer3”) 和 <Order> 元素 (diffgr:id=“Order3”)。 這兩個元素都未指定 diffgr:hasChanges 屬性。 因此,DiffGram 處理邏輯會忽略這些元素。
<DataInstance> 區塊具有 <Customer> 元素 (diffgr:id=“Customer4”) 和 Order> 元素 (diffgr:id=“Order4”),在前一個<區塊中<沒有對應的元素。> DataInstance> 區塊中的<這些專案指定 diffgr:hasChanges=“inserted”。 因此,會在 Cust 數據表和 Ord 數據表中加入新的記錄。
測試 DiffGram
在 tempdb 資料庫中建立下列數據表。
CREATE TABLE Cust( CustomerID nchar(5) Primary Key, CompanyName nvarchar(40) NOT NULL , ContactName nvarchar(60) NULL) GO CREATE TABLE Ord( OrderID int Primary Key, CustomerID nchar(5) Foreign Key REFERENCES Cust(CustomerID)) GO新增此範例資料:
INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ALFKI', N'Alfreds Futterkiste', N'Maria Anders') INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ANATR', N'Ana Trujillo Emparedados y helados', N'Ana Trujillo') INSERT INTO Cust(CustomerID, CompanyName, ContactName) VALUES (N'ANTON', N'Antonio Moreno Taquer??a', N'Antonio Moreno') INSERT INTO Ord(OrderID, CustomerID) VALUES(1, N'ALFKI') INSERT INTO Ord(OrderID, CustomerID) VALUES(2, N'ANATR') INSERT INTO Ord(OrderID, CustomerID) VALUES(3, N'ANTON')複製上述的 DiffGram,並將它貼到文字檔中。 將檔案儲存為上一個步驟中使用的相同資料夾中 MyDiffGram.xml。
複製本主題稍早提供的 DiffGramSchema,並將它貼到文本檔中。 將檔案儲存為 DiffGramSchema.xml。
建立並使用 SQLXML 4.0 測試腳本 (Sqlxml4test.vbs) 來執行 DiffGram。
如需詳細資訊,請參閱使用 ADO 執行 SQLXML 4.0 查詢。
E. 搭配 diffgr:parentID 註釋使用 DiffGram 套用更新
這個範例說明如何在套用更新時使用 DiffGram 區塊之前>所指定的<parentID 批注。
<NewDataSet />
<diffgr:before>
<Order diffgr:id="Order1" msdata:rowOrder="0" OrderID="2" />
<Order diffgr:id="Order3" msdata:rowOrder="2" OrderID="4" />
<OrderDetail diffgr:id="OrderDetail1"
diffgr:parentId="Order1"
msdata:rowOrder="0"
ProductID="13"
OrderID="2" />
<OrderDetail diffgr:id="OrderDetail3"
diffgr:parentId="Order3"
ProductID="77"
OrderID="4"/>
</diffgr:before>
</diffgr:diffgram>
此 DiffGram 會指定刪除作業,因為只有 前>一個< 區塊。 在 DiffGram 中, parentID 註釋用來指定訂單和訂單詳細數據之間的父子關聯性。 當 SQLXML 刪除記錄時,它會從這個關聯性識別的子數據表中刪除記錄,然後從對應的父數據表中刪除記錄。