Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Quando si aggiornano i dati esistenti, è necessario specificare sia i <blocchi prima><che dopo> . Gli elementi specificati nei <blocchi prima> e <dopo> descrivono la modifica desiderata. L'updategram usa gli elementi specificati nel <blocco prima> per identificare i record esistenti nel database. Gli elementi corrispondenti nel <blocco after> indicano come devono essere esaminati i record dopo l'esecuzione dell'operazione di aggiornamento. Da queste informazioni, l'updategram crea un'istruzione SQL corrispondente al <blocco after> . L'updategram usa quindi questa istruzione per aggiornare il database.
Questo è il formato updategram per un'operazione di aggiornamento:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync [mapping-schema="SampleSchema.xml"] >
<updg:before>
<ElementName [updg:id="value"] .../>
[<ElementName [updg:id="value"] .../> ... ]
</updg:before>
<updg:after>
<ElementName [updg:id="value"] ... />
[<ElementName [updg:id="value"] .../> ...]
</updg:after>
</updg:sync>
</ROOT>
<updg:before>
Gli elementi nel <blocco before> identificano i record esistenti nelle tabelle di database.
<updg:after>
Gli elementi del <blocco after> descrivono il modo in cui i record specificati nel <blocco prima> devono essere esaminati dopo l'applicazione degli aggiornamenti.
L'attributo mapping-schema identifica lo schema di mapping da usare dall'updategram. Se l'updategram specifica uno schema di mapping, i nomi degli elementi e degli attributi specificati nei <blocchi prima> e <dopo> devono corrispondere ai nomi nello schema. Lo schema di mapping esegue il mapping di questi nomi di elemento o attributo ai nomi della tabella di database e delle colonne.
Se un updategram non specifica uno schema, updategam usa il mapping predefinito. Nel mapping predefinito, elementName<> specificato nell'updategram esegue il mapping alla tabella di database e gli elementi o gli attributi figlio e vengono mappati alle colonne di database.
Un elemento nel <blocco before> deve corrispondere a una sola riga di tabella nel database. Se l'elemento corrisponde a più righe di tabella o non corrisponde ad alcuna riga di tabella, l'updategram restituisce un errore e annulla l'intero <blocco di sincronizzazione> .
Un updategram può includere più <blocchi di sincronizzazione> . Ogni <blocco di sincronizzazione> viene considerato come una transazione. Ogni <blocco di sincronizzazione> può avere più <blocchi prima> e <dopo> . Ad esempio, se si aggiornano due dei record esistenti, è possibile specificare due <coppie prima> e <dopo> , una per ogni record da aggiornare.
Uso dell'attributo updg:id
Quando vengono specificati più elementi nei <blocchi prima e dopo, usare l'attributo per contrassegnare le righe nei blocchi prima>>e dopo.<<><>updg:id La logica di elaborazione usa queste informazioni per determinare il record nel <blocco prima> delle coppie di blocchi con il record nel <blocco after> .
L'attributo updg:id non è necessario (anche se consigliato) se esiste una delle opzioni seguenti:
Gli elementi nello schema di mapping specificato hanno l'attributo
sql:key-fieldsdefinito su di essi.Esiste uno o più valori specifici specificati per i campi chiave nell'updategram.
In caso affermativo, l'updategram usa le colonne chiave specificate in sql:key-fields per associare gli elementi nei <blocchi prima> e <dopo> .
Se lo schema di mapping non identifica le colonne chiave (tramite sql:key-fields) o se l'updategram sta aggiornando un valore di colonna chiave, è necessario specificare updg:id.
I record identificati nei <blocchi prima> e <dopo> non devono essere nello stesso ordine. L'attributo updg:id forza l'associazione tra gli elementi specificati nei <blocchi prima> e <dopo> .
Se si specifica un elemento nel <blocco prima> e un solo elemento corrispondente nel blocco after>, l'utilizzo<updg:id di non è necessario. Tuttavia, è consigliabile specificare updg:id comunque per evitare ambiguità.
Esempi
Prima di usare gli esempi di updategram, tenere presente quanto segue:
La maggior parte degli esempi usa il mapping predefinito, ovvero non viene specificato alcuno schema di mapping nell'updategram. Per altri esempi di updategram che usano schemi di mapping, vedere Specifica di uno schema di mapping con annotazioni in un updategram (SQLXML 4.0).
La maggior parte degli esempi usa il database di esempio AdventureWorks. Tutti gli aggiornamenti vengono applicati alle tabelle di questo database. È possibile ripristinare il database AdventureWorks.
Un. Aggiornamento di un record
L'updategram seguente aggiorna il cognome del dipendente a Fuller nella tabella Person.Contact del database AdventureWorks. L'updategram non specifica alcuno schema di mapping; pertanto, l'updategram usa il mapping predefinito.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
<Person.Contact ContactID="1" />
</updg:before>
<updg:after>
<Person.Contact LastName="Abel-Achong" />
</updg:after>
</updg:sync>
</ROOT>
Il record descritto nel <blocco before> rappresenta il record corrente nel database. L'updategram usa tutti i valori di colonna specificati nel <blocco prima> per cercare il record. In questo updategram, il <blocco before> fornisce solo la colonna ContactID, pertanto l'updategram utilizza solo il valore per cercare il record. Se si dovesse aggiungere il valore LastName a questo blocco, l'updategram utilizzerebbe sia i valori ContactID che LastName per la ricerca.
In questo updategram il <blocco after> fornisce solo il valore della colonna LastName perché questo è l'unico valore da modificare.
Per testare l'updategram
Copiare il modello updategram precedente e incollarlo in un file di testo. Salvare il file come UpdateLastName.xml.
Creare e usare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire l'updategram.
Per altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.
B. Aggiornamento di più record usando l'attributo updg:id
In questo esempio, l'updategram esegue due aggiornamenti nella tabella HumanResources.Shift nel database AdventureWorks:
Cambia il nome del turno di giorno originale che inizia alle 7:00 da "Day" a "Early Morning".
Inserisce un nuovo turno denominato "Late Morning" che inizia alle 10:00.
Nell'updategram l'attributo updg:id crea associazioni tra gli elementi nei <blocchi prima> e <dopo> .
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
<HumanResources.Shift updg:id="x" Name="Day" />
</updg:before>
<updg:after>
<HumanResources.Shift updg:id="y" Name="Late Morning"
StartTime="1900-01-01 10:00:00.000"
EndTime="1900-01-01 18:00:00.000"
ModifiedDate="2004-06-01 00:00:00.000"/>
<HumanResources.Shift updg:id="x" Name="Early Morning" />
</updg:after>
</updg:sync>
</ROOT>
Si noti che l'attributo updg:id associa la prima istanza dell'elemento <HumanResources.Shift> nel <blocco before> con la seconda istanza dell'elemento <HumanResources.Shift> nel <blocco after> .
Per testare l'updategram
Copiare il modello updategram precedente e incollarlo in un file di testo. Salvare il file come UpdateMultipleRecords.xml.
Creare e usare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire l'updategram.
Per altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.
C. Specifica di più <blocchi prima> e <dopo>
Per evitare ambiguità, è possibile scrivere l'updategram nell'esempio B usando più <coppie di blocchi prima> e <dopo> . Specificare <coppie prima> e <dopo> è un modo per specificare più aggiornamenti con un minimo di confusione. Inoltre, se ognuno dei <blocchi prima> e <dopo> specifica al massimo un elemento, non è necessario usare l'attributo updg:id .
Annotazioni
Per formare una coppia, il <tag after> deve seguire immediatamente il tag corrispondente< prima> del tag.
Nell'updategram seguente, il primo <prima> e <dopo> la coppia aggiorna il nome del turno di turno per il turno di giorno. La seconda coppia inserisce un nuovo record shift.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
<HumanResources.Shift ShiftID="1" Name="Day" />
</updg:before>
<updg:after>
<HumanResources.Shift Name="Early Morning" />
</updg:after>
<updg:before>
</updg:before>
<updg:after>
<HumanResources.Shift Name="Late Morning"
StartTime="1900-01-01 10:00:00.000"
EndTime="1900-01-01 18:00:00.000"
ModifiedDate="2004-06-01 00:00:00.000"/>
</updg:after>
</updg:sync>
</ROOT>
Per testare l'updategram
Copiare il modello updategram precedente e incollarlo in un file di testo. Salvare il file come UpdateMultipleBeforeAfter.xml.
Creare e usare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire l'updategram.
Per altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.
D. Specifica di più <blocchi di sincronizzazione>
È possibile specificare più <blocchi di sincronizzazione> in un updategram. Ogni <blocco di sincronizzazione> specificato è una transazione indipendente.
Nell'updategram seguente il primo <blocco di sincronizzazione> aggiorna un record nella tabella Sales.Customer. Per semplicità, l'updategram specifica solo i valori di colonna richiesti; il valore Identity (CustomerID) e il valore da aggiornare (SalesPersonID).
Il secondo <blocco di sincronizzazione> aggiunge due record alla tabella Sales.SalesOrderHeader. Per questa tabella, SalesOrderID è una colonna di tipo IDENTITY. Pertanto, l'updategram non specifica il valore di SalesOrderID in ognuno degli <elementi Sales.SalesOrderHeader> .
Specificare più <blocchi di sincronizzazione> è utile perché se il secondo <blocco di sincronizzazione (una transazione) non riesce ad aggiungere record alla tabella Sales.SalesOrderHeader, il primo blocco di sincronizzazione>>può comunque aggiornare il record del cliente nella tabella Sales.Customer.<
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
<Sales.Customer CustomerID="1" SalesPersonID="280" />
</updg:before>
<updg:after>
<Sales.Customer CustomerID="1" SalesPersonID="283" />
</updg:after>
</updg:sync>
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
<Sales.SalesOrderHeader
CustomerID="1"
RevisionNumber="1"
OrderDate="2004-07-01 00:00:00.000"
DueDate="2004-07-13 00:00:00.000"
OnlineOrderFlag="0"
ContactID="378"
BillToAddressID="985"
ShipToAddressID="985"
ShipMethodID="5"
SubTotal="24643.9362"
TaxAmt="1971.5149"
Freight="616.0984"
rowguid="01010101-2222-3333-4444-556677889900"
ModifiedDate="2004-07-08 00:00:00.000" />
<Sales.SalesOrderHeader
CustomerID="1"
RevisionNumber="1"
OrderDate="2004-07-01 00:00:00.000"
DueDate="2004-07-13 00:00:00.000"
OnlineOrderFlag="0"
ContactID="378"
BillToAddressID="985"
ShipToAddressID="985"
ShipMethodID="5"
SubTotal="1000.0000"
TaxAmt="0.0000"
Freight="0.0000"
rowguid="10101010-2222-3333-4444-556677889900"
ModifiedDate="2004-07-09 00:00:00.000" />
</updg:after>
</updg:sync>
</ROOT>
Per testare l'updategram
Copiare il modello updategram precedente e incollarlo in un file di testo. Salvare il file come UpdateMultipleSyncs.xml.
Creare e usare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire l'updategram.
Per altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.
E. Uso di uno schema di mapping
In questo esempio l'updategram specifica uno schema di mapping usando l'attributo mapping-schema . Non esiste alcun mapping predefinito, ovvero lo schema di mapping fornisce il mapping necessario di elementi e attributi nell'updategram alle tabelle e alle colonne del database.
Gli elementi e gli attributi specificati nell'updategram fanno riferimento agli elementi e agli attributi nello schema di mapping.
Lo schema di mapping XSD seguente include <elementi Customer>, <Order> ed <OD> che eseguono il mapping alle tabelle Sales.Customer, Sales.SalesOrderHeader e Sales.SalesOrderDetail nel database.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="CustomerOrder"
parent="Sales.Customer"
parent-key="CustomerID"
child="Sales.SalesOrderHeader"
child-key="CustomerID" />
<sql:relationship name="OrderOD"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Customer" sql:relation="Sales.Customer" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Order"
sql:relation="Sales.SalesOrderHeader"
sql:relationship="CustomerOrder" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="OD"
sql:relation="Sales.SalesOrderDetail"
sql:relationship="OrderOD" >
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="ProductID" type="xsd:integer" />
<xsd:attribute name="UnitPrice" type="xsd:decimal" />
<xsd:attribute name="OrderQty" type="xsd:integer" />
<xsd:attribute name="UnitPriceDiscount" type="xsd:decimal" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="OrderDate" type="xsd:date" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
Questo schema di mapping (UpdategramMappingSchema.xml) viene specificato nell'updategram seguente. L'updategram aggiunge un elemento di dettaglio dell'ordine nella tabella Sales.SalesOrderDetail per un ordine specifico. L'updategram include elementi annidati: un <elemento OD> annidato all'interno di un <elemento Order> . La relazione chiave primaria/chiave esterna tra questi due elementi viene specificata nello schema di mapping.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="UpdategramMappingSchema.xml" >
<updg:before>
<Order SalesOrderID="43659" />
</updg:before>
<updg:after>
<Order SalesOrderID="43659" >
<OD ProductID="776" UnitPrice="2329.0000"
OrderQty="2" UnitPriceDiscount="0.0" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
Per testare l'updategram
Copiare lo schema di mapping precedente e incollarlo in un file di testo. Salvare il file come UpdategramMappingSchema.xml.
Copiare il modello updategram precedente e incollarlo in un file di testo. Salvare il file come UpdateWithMappingSchema.xml nella stessa cartella usata per salvare lo schema di mapping (UpdategramMappingSchema.xml).
Creare e usare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire l'updategram.
Per altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.
Per altri esempi di updategram che usano schemi di mapping, vedere Specifica di uno schema di mapping con annotazioni in un updategram (SQLXML 4.0).
F. Uso di uno schema di mapping con attributi IDREFS
In questo esempio viene illustrato come gli updategram usano gli attributi IDREFS nello schema di mapping per aggiornare i record in più tabelle. Per questo esempio, si supponga che il database sia costituito dalle tabelle seguenti:
Student(StudentID, LastName)
Course(CourseID, CourseName)
Enrollment(StudentID, CourseID)
Poiché uno studente può iscriversi a molti corsi e un corso può avere molti studenti, la terza tabella, la tabella Enrollment, è necessaria per rappresentare questa relazione M:N.
Lo schema di mapping XSD seguente fornisce una visualizzazione XML delle tabelle utilizzando gli <elementi Student>, <Course> e <Enrollment> . Gli attributi IDREFS nello schema di mapping specificano la relazione tra questi elementi. L'attributo StudentIDList nell'elemento <Course> è un attributo di tipo IDREFS che fa riferimento alla colonna StudentID nella tabella Enrollment. Analogamente, l'attributo EnrolledIn nell'elemento <Student> è un attributo di tipo IDREFS che fa riferimento alla colonna CourseID nella tabella Enrollment.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="StudentEnrollment"
parent="Student"
parent-key="StudentID"
child="Enrollment"
child-key="StudentID" />
<sql:relationship name="CourseEnrollment"
parent="Course"
parent-key="CourseID"
child="Enrollment"
child-key="CourseID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Course" sql:relation="Course"
sql:key-fields="CourseID" >
<xsd:complexType>
<xsd:attribute name="CourseID" type="xsd:string" />
<xsd:attribute name="CourseName" type="xsd:string" />
<xsd:attribute name="StudentIDList" sql:relation="Enrollment"
sql:field="StudentID"
sql:relationship="CourseEnrollment"
type="xsd:IDREFS" />
</xsd:complexType>
</xsd:element>
<xsd:element name="Student" sql:relation="Student" >
<xsd:complexType>
<xsd:attribute name="StudentID" type="xsd:string" />
<xsd:attribute name="LastName" type="xsd:string" />
<xsd:attribute name="EnrolledIn" sql:relation="Enrollment"
sql:field="CourseID"
sql:relationship="StudentEnrollment"
type="xsd:IDREFS" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
Ogni volta che si specifica questo schema in un updategram e si inserisce un record nella tabella Course, l'updategram inserisce un nuovo record del corso nella tabella Course. Se si specifica uno o più nuovi ID studente per l'attributo StudentIDList, l'updategram inserisce anche un record nella tabella Enrollment per ogni nuovo studente. L'updategram garantisce che non vengano aggiunti duplicati alla tabella Enrollment.
Per testare l'updategram
Creare queste tabelle nel database specificato nella radice virtuale:
CREATE TABLE Student(StudentID varchar(10) primary key, LastName varchar(25)) CREATE TABLE Course(CourseID varchar(10) primary key, CourseName varchar(25)) CREATE TABLE Enrollment(StudentID varchar(10) references Student(StudentID), CourseID varchar(10) references Course(CourseID))Aggiungere questi dati di esempio:
INSERT INTO Student VALUES ('S1','Davoli') INSERT INTO Student VALUES ('S2','Fuller') INSERT INTO Course VALUES ('CS101', 'C Programming') INSERT INTO Course VALUES ('CS102', 'Understanding XML') INSERT INTO Enrollment VALUES ('S1', 'CS101') INSERT INTO Enrollment VALUES ('S1', 'CS102')Copiare lo schema di mapping precedente e incollarlo in un file di testo. Salvare il file come SampleSchema.xml.
Salvare l'updategram (SampleUpdategram) nella stessa cartella usata per salvare lo schema di mapping nel passaggio precedente. Questo updategram elimina uno studente con StudentID="1" dal corso CS102.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <updg:sync mapping-schema="SampleSchema.xml" > <updg:before> <Student updg:id="x" StudentID="S1" LastName="Davolio" EnrolledIn="CS101 CS102" /> </updg:before> <updg:after > <Student updg:id="x" StudentID="S1" LastName="Davolio" EnrolledIn="CS101" /> </updg:after> </updg:sync> </ROOT>Creare e usare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire l'updategram.
Per altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.
Salvare ed eseguire il seguente updategram come descritto nei passaggi precedenti. L'updategram aggiunge di nuovo lo studente con StudentID="1" al corso CS102 aggiungendo un record nella tabella Enrollment.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <updg:sync mapping-schema="SampleSchema.xml" > <updg:before> <Student updg:id="x" StudentID="S1" LastName="Davolio" EnrolledIn="CS101" /> </updg:before> <updg:after > <Student updg:id="x" StudentID="S1" LastName="Davolio" EnrolledIn="CS101 CS102" /> </updg:after> </updg:sync> </ROOT>Salvare ed eseguire questo updategram successivo come descritto nei passaggi precedenti. Questo updategram inserisce tre nuovi studenti e li registra nel corso CS101. Anche in questo caso, la relazione IDREFS inserisce i record nella tabella Enrollment.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <updg:sync mapping-schema="SampleSchema.xml" > <updg:before> <Course updg:id="y" CourseID="CS101" CourseName="C Programming" /> </updg:before> <updg:after > <Student updg:id="x1" StudentID="S3" LastName="Leverling" /> <Student updg:id="x2" StudentID="S4" LastName="Pecock" /> <Student updg:id="x3" StudentID="S5" LastName="Buchanan" /> <Course updg:id="y" CourseID="CS101" CourseName="C Programming" StudentIDList="S3 S4 S5" /> </updg:after> </updg:sync> </ROOT>
Questo è lo schema XDR equivalente:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Enrollment" sql:relation="Enrollment" sql:key-fields="StudentID CourseID">
<AttributeType name="StudentID" dt:type="id" />
<AttributeType name="CourseID" dt:type="id" />
<attribute type="StudentID" />
<attribute type="CourseID" />
</ElementType>
<ElementType name="Course" sql:relation="Course" sql:key-fields="CourseID">
<AttributeType name="CourseID" dt:type="id" />
<AttributeType name="CourseName" />
<attribute type="CourseID" />
<attribute type="CourseName" />
<AttributeType name="StudentIDList" dt:type="idrefs" />
<attribute type="StudentIDList" sql:relation="Enrollment" sql:field="StudentID" >
<sql:relationship
key-relation="Course"
key="CourseID"
foreign-relation="Enrollment"
foreign-key="CourseID" />
</attribute>
</ElementType>
<ElementType name="Student" sql:relation="Student">
<AttributeType name="StudentID" dt:type="id" />
<AttributeType name="LastName" />
<attribute type="StudentID" />
<attribute type="LastName" />
<AttributeType name="EnrolledIn" dt:type="idrefs" />
<attribute type="EnrolledIn" sql:relation="Enrollment" sql:field="CourseID" >
<sql:relationship
key-relation="Student"
key="StudentID"
foreign-relation="Enrollment"
foreign-key="StudentID" />
</attribute>
<element type="Enrollment" sql:relation="Enrollment" >
<sql:relationship key-relation="Student"
key="StudentID"
foreign-relation="Enrollment"
foreign-key="StudentID" />
</element>
</ElementType>
</Schema>
Per altri esempi di updategram che usano schemi di mapping, vedere Specifica di uno schema di mapping con annotazioni in un updategram (SQLXML 4.0).