Convertirea datelor xml în format sql folosind funcția bulkload sqlxml în structură

Acest articol descrie în detaliu funcția SQLXML Bulkload creând o aplicație care convertește datele de intrare XML în tabele relaționale SQL Server. Vom încerca, de asemenea, să răspundem la întrebările tipice care apar atunci când se utilizează funcția Bulkload într-o aplicație corporativă. În special, vom discuta următoarele subiecte:







  • Conversia unei ierarhii XML complexe într-o singură masă.
  • Utilizați funcția Bulkload în aplicația .NET.
  • Utilizarea clasei Stream ca mecanism de introducere a datelor pentru funcția Bulkload în .NET.

Sarcina: Salvarea conținutului fluxurilor RSS în SQL Server

În acest articol, voi demonstra crearea unei aplicații care acceptă date despre tehnologia RSS (Really Simple Syndication) și stochează informațiile solicitate într-o bază de date relațională. RSS este un format XML folosit pentru a difuza știri, precum și alte informații din unele surse. Soluția acestei sarcini include două aspecte. În primul rând, avem nevoie de un mecanism pentru a converti datele XML de intrare în tabele și coloane relaționale. Formatul XML este definit în prealabil și nu este necesar să inserăm în bază de date toate informațiile primite de la canal. În al doilea rând, este necesară implementarea transferului de date de intrare direct pe servere. Aceste sarcini sunt rezolvate utilizând schema de conversie și funcția Bulkload în SQLXML.

Această sarcină este tipică pentru sistemele de afaceri, unde datele de intrare sunt prezentate sub formă de XML, iar o bază de date relațională este utilizată ca stocare de servere. Sursa datelor de intrare XML poate fi serviciile web, alte mesaje XML de la parteneri de afaceri externi sau surse din cadrul companiei în sine.

O scurtă introducere în schemele SQLXML adnotate

Schemele XSD sunt adesea folosite pentru a descrie conținutul și structura datelor XML, astfel încât să puteți crea o schemă XSD care descrie structura fluxurilor RSS. În aplicația noastră, nu vom crea o schemă XSD pentru fluxurile RSS obișnuite, ci se va concentra pe subsetul structurii XML utilizate de majoritatea canalelor. Canalul folosit pentru a scrie acest articol se bazează pe Yahoo! Noutati RSS Feed. Trebuie să adnotăm schema XSD utilizând metadatele relaționale, care este folosită în SQLXML pentru a converti codul XML într-un format de bază de date relațională. Vedeți conturul adnotat folosit pentru aplicația noastră.

Lista 1. Schema adnotată utilizată pentru aplicația noastră

Schema XSD de mai sus conține adnotările de date relaționale necesare conversiei. Toate adnotările de conversie legate de SQLXML aparțin spațiului de nume xmlns: sql = "urn: schemas-microsoft-com: mapping-schema". Cele mai importante sunt adnotarea sql: relație a elementului element și diferitele adnotări de câmp SQL: care se referă la elementele copilului său. Adnotarea SQL: convertește un element într-o tabelă NewsFeed și adnotarea câmpului sql convertește elementele copilului în coloane din tabel. Atributele elementului pot fi, de asemenea, convertite în coloanele din tabel. De fapt, adnotarea domeniului sql este opțională, deoarece cartografierea "tabel-element" cuprinde toate elementele și atributele copilului acestui element. În schema XSD de mai sus, numai elementele isPermaLink și pubDate sunt furnizate cu adnotarea câmpului sql, deoarece numele coloanelor corespunzătoare sunt diferite. Numele celorlalte elemente sunt supuse regulilor standard de conversie: ele sunt convertite automat la aceleași nume de coloane.

În același timp, fluxul RSS include multe alte elemente, cum ar fi canalul, ttl și imaginea, care, în cazul nostru, nu trebuie să fie convertite într-un format de bază de date relațională. Pentru a rezolva această problemă în SQLXML, puteți folosi adnotările mapate sql: is-constant sau sql: mapped.

Adnotarea sql: is-constant este folosită în principal pentru a crea elemente de împachetare care nu apar în baza de date. În cazul nostru, elementele de rss și canal sunt elemente de înfășurare în canalul RSS, deci ele utilizează adnotarea sql: is-constant. Când folosiți adnotarea sql: is-constant, trebuie luate în considerare următoarele. În primul rând, se poate aplica numai elementelor de tip complex. În al doilea rând, dacă un element constant are atribute, aceste atribute nu pot fi convertite în coloane de bază de date.







Adnotarea sql: mapped vă permite să specificați în mod explicit că un element sau un atribut nu trebuie convertit în niciun obiect al bazei de date relaționale. Această adnotare a fost folosită de mai multe ori în cadrul schemei. Am marcat atributul versiune cu adnotarea sql: mapped = "false" în mod explicit, deoarece face parte dintr-un element permanent. De asemenea, am adnotat cu sql: mapped = "false" toate elementele canalului copil care au un tip simplu. De asemenea, folosesc această adnotare pentru elementul imagine. Trebuie remarcat faptul că imaginea este un element de tip complex, prin urmare, adnotând-o, am împiedicat transformarea acestui element însuși, precum și a tuturor copiilor și atributelor acestuia. Adnotarea mapată sql poate fi utilizată atât pentru elemente simple, cât și pentru elemente de tip complex. În cel de-al doilea caz, toți copiii și atributele care fac parte din tipul complex obțin și valoarea adnotării mapate sql: mapped.

Avantajul utilizării unei scheme de conversie pentru a mapa datele XML de intrare în baza de date este acela că aceeași mapare poate fi utilizată atât pentru interogările bazei de date, cât și pentru generarea diferitelor reprezentări de date XML. În aceste scopuri, SQLXML oferă o funcție XPath.

Folosind Bulkload din Codul Gestionat

Funcția SQLXML Bulkload vă permite să încărcați datele de intrare XML într-o bază de date relațională. Această funcție utilizează procesul SQL Server bcp și este mecanismul optim pentru încărcarea unor cantități mari de date XML de intrare pe server. Funcția este implementată ca obiect COM și utilizează furnizori SQLOLEDB. Din acest motiv, este convenabil să se folosească atunci când se programează prin ActiveX Data Objects (ADO), precum și folosind limbi de scripting, de exemplu VBScript. În cazul nostru, funcția Bulkload este utilizată în aplicația .NET. Pentru a implementa această funcție, puteți utiliza una dintre următoarele metode:

  • utilizați programul tlbimp.exe. Pentru a importa definițiile de tip COM în ansamblul runtime și apoi adăugați ansamblul Interop generat în proiect;
  • Adăugați un link direct la biblioteca Bulkload DDL (xblkld3.dll) în proiectul Visual Studio .NET. Aceasta va crea un ansamblu Interop, care poate fi utilizat în proiect.

După efectuarea oricăreia dintre procedurile de mai sus, utilizarea Bulkload nu este dificilă:

Listing 2. Folosind Bulkload

Încărcarea bazei de date utilizând SQLXML Bulkload

Voi demonstra două soluții la această problemă. În ambele cazuri, folosesc interfața UCOMIStream (EN). în care există o definiție controlată a interfeței IStream. În prima variantă, este implementat un obiect cu wrap-thread care implementează interfața UCOMIStream. Mai jos este un exemplu de implementare a acestei interfețe:

Listarea 3. Un obiect de înfășurare a firului care implementează interfața UCOMIStream

După cum puteți vedea din fragmentul de cod de mai sus, aceasta nu este o implementare completă a interfeței UCOMIStream. Pentru funcția Bulkload, trebuie doar să implementați următoarele metode: Citire, Scriere, Stat și Căutarea. Puteți trece clasa UCOMStreamWrapper direct la metoda Execute din Bulkload. Soluția de mai sus este o modalitate eficientă de a transfera datele streaming ale funcției Bulkload în aplicația .NET.

Mai jos este o soluție alternativă care nu necesită implementarea interfeței UCOMIStream.

Listing 4. O soluție care nu necesită implementarea interfeței UCOMIStream

Dezavantajul acestei soluții este că nu este un mod foarte rațional de a transfera fluxurile către funcția Bulkload. Problema este utilizarea funcției CreateStreamOnHGlobal, care stochează datele în memorie și determină o scădere a performanței.

În codul care poate fi descărcat pentru acest articol, sunt eșantioane ale fiecăruia dintre soluțiile de mai sus sub formă de proiecte separate.

Este important să rețineți că atunci când utilizați ADO sau limbajul scriptului, puteți transfera direct fluxul ADODB.Stream la funcția Bulkload. Documentația SQLXML oferă un exemplu de streaming într-un mediu VBScript.

Modelul obiect Bulkload

Modelul obiect Bulkload include multe proprietăți care oferă flexibilitate și funcționalitate suplimentare. Am folosit proprietățile ErrorLogFile și KeepIdentity. Dacă este specificată proprietatea ErrorLogFile, funcția Bulkload în timpul procesării înregistrează eventualele erori și avertismente din fișierul corespunzător. Proprietatea KeepIdentity este utilizată pentru a configura coloanele de identificare. În aplicația noastră, coloana ID este o coloană de identificare și dacă proprietatea KeepIdentity este setată la false, Bulkload utilizează valorile de autentificare generate de SQL Server. Pentru a utiliza datele din sursă în scopuri de identificare, setați proprietatea KeepIdentity la true (implicit).

SchemaGen este o altă proprietate interesantă care nu este utilizată în cererea mea, dar poate fi foarte utilă. Cu aceasta, puteți genera tabele server în baza de date înainte de începerea procesului de descărcare. Bulkload utilizează numele elementelor și atributelor, precum și informații despre tipurile acestora din schema XSD pentru a genera tabelele și coloanele corespunzătoare. proprietate SchemaGen creează tabele de restricție, dar, în cazul în care proprietățile SGUseID setată la true, iar cheia principală de tipul definit ID XSD, această informație este folosită pentru a genera cheia primară. Această proprietate utilizează, de asemenea, adnotarea relației sql: pentru a se potrivi cu constrângerile cheii străine. Pentru mai multe informații despre toate proprietățile utilizate de Bulkload, consultați documentația inclusă în SQLXML.

concluzie

În acest articol am arătat cum să utilizez funcția Bulkload din SQLXML pentru a popula baza de date cu date de intrare XML. Datele relaționale pot fi apoi ușor de întrebat utilizând tehnologii precum ADO.NET, așa cum se demonstrează într-o aplicație disponibilă pentru descărcare. Funcția Bulkload poate fi folosită atât cu instrumentele obișnuite ADO, cât și cu aplicațiile în limbile de scripting. De asemenea, poate fi folosit într-un mediu .NET prin intermediul mecanismului COM Interop. Articolul a arătat posibilități flexibile de conversie a unei ierarhii XML complexe într-o schemă de baze de date simple utilizând o schemă de conversie.







Articole similare

Trimiteți-le prietenilor: