2012-10-10 16 views
5

Sto cercando di utilizzare SQLXMLBulkLoader4 dal codice C# in un DB SQL 2008. Ma per qualche ragione non inserisce alcuna riga, nonostante non abbia generato alcun errore. Ho utilizzato il bulkload del proprio file ErrorLog (per verificare eventuali errori che potrebbero non causarne il blocco), ma non viene segnalato alcun errore.SQLXML BulkLoader non genera alcun errore ma non viene inserito alcun dato

Ho un file XML scaricato da un fornitore (in pratica un elenco di prodotti), ho scritto un XSD per abbinare i campi al nostro DB. Non c'è nient'altro che scrive su quelle tabelle specifiche e nient'altro che usa quei file.

Il mio codice bulkload appare come segue (I X'ed i valori di stringa di connessione effettiva):

public void Bulkload(string schemaFile, string xmlFile, string source) 
    { 
     SQLXMLBULKLOADLib.SQLXMLBulkLoad4 bulkload = new SQLXMLBULKLOADLib.SQLXMLBulkLoad4(); 

     try 
     { 
      bulkload.ConnectionString = "Provider=sqloledb;server=X;database=X;uid=X;pwd=X"; 
      bulkload.ErrorLogFile = k_ArticleInfoDirectory + source + "BulkLoadError.log"; 
      bulkload.KeepIdentity = false; 
      bulkload.Execute(schemaFile, xmlFile); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Fel i BL: " + e); 
      throw; 
     } 
     finally 
     { 
      bulkload = null; 
     } 

    } 

L'XML assomiglia a questo (ridotta, tutto sotto è solo un altro paio di prodotti-campi e poi più prodotti):

<?xml version="1.0" encoding="utf-8"?> 
<GetProductsResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Status xmlns="http://schemas.servicestack.net/types"> 
    <Code>0</Code> 
    <Message>Ok</Message> 
    </Status> 
    <NumberOfProducts xmlns="http://schemas.servicestack.net/types">9826</NumberOfProducts> 
    <Products xmlns="http://schemas.servicestack.net/types"> 
    <Product> 
     <ProductID>1000002</ProductID> 
     <CreatedDate>2011-11-24 15:54</CreatedDate> 
     <UpdatedDate>2011-11-24 15:54</UpdatedDate> 
     <Title>Vi tolererar inga förlorare - klanen Kennedy</Title> 
     <Publisher>Piratförlaget</Publisher> 
     ... And some more fields per Product 

Il XSD che ho scritto si presenta così (ancora una volta accorciata):

<?xml version="1.0" encoding="iso-8859-1"?> 
<xs:schema targetNamespace="http://schemas.servicestack.net/types" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 

<xs:annotation> 
    <xs:appinfo> 

     <sql:relationship name="Status" 
     parent="tblElibProduct" 
     parent-key="id" 
     child="tblElibStatus" 
     child-key="product_id" /> 
        ... + Several other sql:relationships 
      </xs:appinfo> 
</xs:annotation> 
    <xs:element name="GetProductsResult" sql:is-constant="1"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Status" sql:is-constant="1"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="Code" type="xs:integer" minOccurs="0" /> 
         <xs:element name="Message" type="xs:string" minOccurs="0" /> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="NumberOfProducts" type="xs:string" sql:is-constant="1"/> 
      <xs:element name="Products" sql:is-constant="1"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" maxOccurs="unbounded" name="Product" sql:relation="tblElibProduct"> 
          <xs:complexType> 
           <xs:sequence> 
            <xs:element minOccurs="1" maxOccurs="1" name="CreatedDate" type="xs:date" sql:field="created_date" /> 
            <xs:element minOccurs="1" maxOccurs="1" name="UpdatedDate" type="xs:date" sql:field="updated_date" /> 
            <xs:element minOccurs="1" maxOccurs="1" name="Title" type="xs:string" sql:field="title" /> 

Mi sono fissata cieca nei namespace, ma mi sembrano corretti. (Leggi molti errori simili in cui diversi spazi dei nomi erano la causa). Il codice è in esecuzione dal mio computer, sia il mio computer sia quello con il DB hanno accesso alla cartella di rete con i file XML e XSD.

Ho provato deliberatamente a modificare alcuni nomi di campo in entrambi i file, e il BulkLoader divampa provocando un errore sul campo che ho appena modificato.

Ho confrontato sia il mio codice BulkLoader che l'XSD con esempi che ho trovato in rete, e non riesco a trovare alcuna differenza che possa spiegare questo comportamento.
Probabilmente è qualcosa di semplice che sto trascurando, ma non lo vedo.

Qualsiasi aiuto mi stia indirizzando nella giusta direzione è profondamente accolto.

Grazie in anticipo!

(PS Scusate il post, se è spento, in qualche modo, è la mia prima volta distacco qui, ho fatto fare la mia ricerca comunque e ho provato a seguire le linee guida su come inserire =))

risposta

1

In seguito sulla base del sospetto che potrebbe esserci un problema di namespace ...

Gli spazi dei nomi corrispondono (tra istanza dell'elemento e dichiarazione dell'elemento) per gli elementi qualificati nell'istanza.

Ma non tutti corrispondono nell'altra direzione; lo schema dichiara un elemento il cui nome esteso è {http://schemas.servicestack.net/types}GetProductsResult, ma nessun elemento di questo tipo appare nell'istanza di input (esiste un GetProductsResult, ma non è qualificato per lo spazio dei nomi).

si potrebbe desiderare di vedere cosa succede se si cambia l'XML in modo che il primo start-tag legge

<GetProductsResult 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://schemas.servicestack.net/types" > 
+0

Questo era il biglietto! G'dang namespaces rovinando la mia giornata ... Grazie per la rapida risposta! =) – MrWizard

1

prima regola da seguire dovrebbe sempre essere: convalidare il XML contro il vostro XSD. Nel tuo caso, sembra più che devi modificare il tuo XSD piuttosto che il tuo XML semplicemente perché sembra che tu stia cercando di adattare il tuo XSD al tuo XML - hai detto downloaded from a supplier.La soluzione dovrebbe funzionare con il file del fornitore, poiché se si desidera ricaricare il file in un secondo momento, non si desidera continuare a modificarlo per adattarlo a quello che sembra essere un XSD difettoso.

In realtà sembra che siano necessari almeno due file XSD: uno definisce uno schema senza uno spazio dei nomi di destinazione e importa un altro schema che ha come target lo http://schemas.servicestack.net/types. Esistono numerose opzioni per consentire di generare un XSD da un XML e per convalidare un XML rispetto a un XSD.

+0

In realtà ha molto senso. Dato che ora è più una soluzione per farlo funzionare mentre il fornitore lavora per fornirci un XSD con cui convalidare. Non è il modo in cui preferirei lavorare, ma cosa fare quando vogliamo vendere i loro prodotti appena possibile ... – MrWizard

Problemi correlati