Выполнение диаграммы обновления при помощи ADO (SQLXML 4.0)

Следующее приложение на языке Microsoft Visual Basic использует ADO для установки соединения с экземпляром Microsoft SQL Server и выполняет диаграмму обновления. Диаграмма обновления изменяет фамилию конкретного сотрудника. В примере используется образец базы данных AdventureWorks.

В этом образце приложения происходит следующее.

  • Объект conn (ADODB.Connection) устанавливает соединение с выполняющимся экземпляром SQL Server на заданном сервере.

  • Объект cmd (ADODB.Command) выполняется для установленного соединения.

  • В качестве диалекта команды задано значение DBGUID_MSSQLXML.

  • Диаграмма обновления копируется в поток команды (strmIn).

  • Выходной поток команды установлен в объект StrmOut (ADODB.Stream), который получает все возвращенные данные.

  • Наконец, выполняется команда (диаграмма обновления).

Ниже представлен образец кода:

Private Sub Form_Load()  Dim cmd As New ADODB.Command  Dim conn As New ADODB.Connection  Dim strmIn As New ADODB.Stream  Dim strmOut As New ADODB.Stream  Dim SQLxml As String  ' Open a connection to the instance of SQL Server.  conn.Provider = "SQLOLEDB"  conn.Open "server=(local); database=AdventureWorks; Integrated Security=SSPI; "  conn.Properties("SQLXML Version") = "SQLXML.4.0"  Set cmd.ActiveConnection = conn  ' Build the command string in the form of an XML template.    SQLxml = "<ROOT xmlns:updg='urn:schemas-microsoft-com:xml-updategram' >"    SQLxml = SQLxml & "  <updg:sync updg:nullvalue='IsNULL'>"    SQLxml = SQLxml & "    <updg:before>"    SQLxml = SQLxml & "       <Person.Contact ContactID='64' Title='IsNULL'/>"    SQLxml = SQLxml & "    </updg:before>"    SQLxml = SQLxml & "    <updg:after>"    SQLxml = SQLxml & "       <Person.Contact ContactID='64' Title='Mr.'/>"    SQLxml = SQLxml & "    </updg:after>"    SQLxml = SQLxml & "  </updg:sync>"    SQLxml = SQLxml & "</ROOT>"  ' Set the command dialect to DBGUID_MSSQLXML.  cmd.Dialect = "{5d531cb2-e6ed-11d2-b252-00c04f681b71}"  ' Open the command stream and write our template to it.  strmIn.Open  strmIn.WriteText SQLxml  strmIn.Position = 0  Set cmd.CommandStream = strmIn  ' Execute the command, open the return stream, and read the result.  strmOut.Open  strmOut.LineSeparator = adCRLF  cmd.Properties("Output Stream").Value = strmOut  cmd.Properties("Output Encoding").Value = "UTF-8"  cmd.Execute , , adExecuteStream  strmOut.Position = 0  Debug.Print strmOut.ReadText  strmOut.Close  strmIn.CloseEnd Sub
ПримечаниеПримечание

Если SQLXML используется из ADO для выполнения диаграмм обновления, которые задают XSD-схему, в объекте соединения необходимо присвоить свойству SQLXML Version значение SQLXML.4.0, как показано в следующем примере кода:

conn.Properties("SQLXML Version") = "SQLXML.4.0"

Указание схемы сопоставления для диаграммы обновления

В этом примере показано, как задать и использовать схему сопоставления в диаграмме обновления.

Сохраните на диск следующую XSD-схему (EmpSchema.xml) и убедитесь, что обновлен заданный в коде путь к расположению схемы сопоставления. Код предполагает, что схема сохранена на диске C: в папке Schemas.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  <xsd:element name="Contact" sql:relation="Person.Contact" >   <xsd:complexType>        <xsd:attribute name="CID"                         sql:field="ContactID"                        type="xsd:string" />         <xsd:attribute name="MName"                         sql:field="MiddleName"                         type="xsd:string" />    </xsd:complexType>  </xsd:element></xsd:schema>

Поскольку можно задать как схему XSD, так и XDR, это эквивалент XDR-схемы:

<?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="Contact" sql:relation="Person.Contact" >       <AttributeType name="CID" />       <AttributeType name="MName" />       <attribute type="CID" sql:field="ContactID" />       <attribute type="MName" sql:field="MiddleName" />     </ElementType>   </Schema> 

Следующий код Visual Basic выполняет диаграмму обновления, связанную со схемой сопоставления. Диаграмма обновления изменяет отчество контакта 1 в таблице Person.Contact.

Private Sub Form_Load()    Dim cmd As New ADODB.Command    Dim conn As New ADODB.Connection    Dim strmIn As New ADODB.Stream    Dim strmOut As New ADODB.Stream    ' Open a connection to the SQL Server.    conn.Provider = "SQLOLEDB"    conn.Open "server=(local); database=AdventureWorks; Integrated Security='SSPI' ;"    conn.Properties("SQLXML Version") = "SQLXML.4.0"    Set cmd.ActiveConnection = conn        ' Open the command stream and write the template to it.    strmIn.Open    strmIn.WriteText "<ROOT xmlns:updg='urn:schemas-microsoft-com:xml-updategram' >"    strmIn.WriteText "  <updg:sync mapping-schema='C:\Schemas\EmpSchema.xml' >"    strmIn.WriteText "      <updg:before>"    strmIn.WriteText "          <Contact CID='1' />"    strmIn.WriteText "      </updg:before>"    strmIn.WriteText "      <updg:after>"    strmIn.WriteText "          <Contact MName='M.'/>"    strmIn.WriteText "      </updg:after>"    strmIn.WriteText "  </updg:sync>"    strmIn.WriteText "</ROOT>"        ' Set the command dialect to XML.    cmd.Dialect = "{5d531cb2-e6ed-11d2-b252-00c04f681b71}"    strmIn.Position = 0    Set cmd.CommandStream = strmIn     ' Execute the command, open the return stream, and read the result.    strmOut.Open    strmOut.LineSeparator = adCRLF    cmd.Properties("Output Stream").Value = strmOut    cmd.Execute , , adExecuteStream    strmOut.Position = 0    Debug.Print strmOut.ReadText    strmOut.Close    strmIn.Close    conn.CloseEnd Sub

Передача параметров

В представленных выше приложениях Visual Basic отсутствует передача параметров. В следующем приложении в диаграмму обновления передаются значения ContactID и MiddleName в качестве параметризованного входа.

Private Sub Form_Load()    Dim cmd As New ADODB.Command  Dim conn As New ADODB.Connection  Dim strmIn As New ADODB.Stream  Dim strmOut As New ADODB.Stream  Dim InputContactID As String  Dim InputMiddleName As String  InputContactID = "1"  InputMiddleName = "Q."  ' Open a connection to the instance of SQL Server.  conn.Provider = "SQLOLEDB"  conn.Open "server=(local); database=AdventureWorks; Integrated Security=SSPI; "  conn.Properties("SQLXML Version") = "SQLXML.4.0"  Set cmd.ActiveConnection = conn  ' Build the command string in the form of an XML template.  SQLxml = "<ROOT xmlns:updg='urn:schemas-microsoft-com:xml-updategram' >"  SQLxml = SQLxml & "<updg:header>"  SQLxml = SQLxml & "<updg:param name='ContactID'/>"  SQLxml = SQLxml & "<updg:param name='MiddleName' />"  SQLxml = SQLxml & "</updg:header>"  SQLxml = SQLxml & "<updg:sync >"  SQLxml = SQLxml & " <updg:before>"  SQLxml = SQLxml & "   <Person.Contact ContactID='$ContactID' />"  SQLxml = SQLxml & "</updg:before>"  SQLxml = SQLxml & "<updg:after>"  SQLxml = SQLxml & "<Person.Contact MiddleName='$MiddleName' />"  SQLxml = SQLxml & "</updg:after>"  SQLxml = SQLxml & "</updg:sync>"  SQLxml = SQLxml & "</ROOT>"  ' Set the command dialect to XML.  cmd.Dialect = "{5d531cb2-e6ed-11d2-b252-00c04f681b71}"  ' Open the command stream and write the template to it.  strmIn.Open  strmIn.WriteText SQLxml  strmIn.Position = 0  Set cmd.CommandStream = strmIn  ' Execute the command, open the return stream, and read the result.  strmOut.Open  strmOut.LineSeparator = adCRLF  cmd.NamedParameters = True  cmd.Parameters.Append cmd.CreateParameter("@ContactID", adBSTR, adParamInput, 1, InputContactID)  cmd.Parameters.Append cmd.CreateParameter("@MiddleName", adBSTR, adParamInput, 7, InputMiddleName)  cmd.Properties("Output Stream").Value = strmOut  cmd.Execute , , adExecuteStream  strmOut.Position = 0  Debug.Print strmOut.ReadTextEnd Sub