2012-10-10 7 views
5

Próbuję użyć SQLXMLBulkLoader4 z kodu C# do w SQL 2008 DB. Ale z jakiegoś powodu nie wstawia żadnych wierszy, mimo że nie popełnia żadnego błędu. Korzystam z własnego pliku ErrorLog w bulkloads (w celu sprawdzenia wszelkich błędów, które nie powodują jego awarii), ale nie zgłoszono błędu.SQLXML BulkLoader nie rzuca żadnego błędu, ale dane nie są wstawiane

Mam plik XML, który jest pobierany od dostawcy (w zasadzie listę produktów), napisałem XSD dopasować pola do naszych DB. Nie ma nic innego, co piszą do tych konkretnych tabel i nic więcej z tych plików.

Mój kod BulkLoad wygląda następująco (I X'ed się rzeczywiste wartości ciągów połączenia):

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; 
     } 

    } 

XML wygląda następująco (okrojona, wszystko poniżej to tylko kilka kilku grup produktowych pola i potem coraz produkty):

<?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 

XSD pisałem wygląda następująco (ponownie skrócić):

<?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" /> 

Wpatrywałem się ślepo w przestrzeń nazw, ale wyglądają one właściwie. (Przeczytaj o wielu podobnych błędach, w których przyczyną były różne przestrzenie nazw). Kod jest uruchamiany z mojego komputera, zarówno mój komputer, jak i ten z DB mają dostęp do folderu sieciowego z plikami XML i XSD.

Próbowałem celowo zmieniając niektóre pola nazwy w obu plikach, a BulkLoader wybucha rzuca błąd na polu Właśnie zmienił.

Mam porównaniu zarówno mój kod BulkLoader i XSD do przykładów znalazłem w internecie, i nie mogę znaleźć żadnej różnicy, która stanowiłaby dla tego zachowania.
To chyba coś łatwego, ale nie widzę tego w banku.

Każda pomoc na wszystkich wskazujące mnie we właściwym kierunku, jest głęboko mile widziane.

Z góry dziękuję!

(PS Przepraszam, jeśli post jest wyłączony w jakiś sposób, to mój pierwszy raz delegowania tutaj, zrobiłem moje badania jednak i starał się postępować zgodnie ze wskazówkami, jak pisać =))

Odpowiedz

1

Kontynuując na podejrzenie, że może być problem nazw ...

przestrzeni nazw są identyczne (pomiędzy przykład element i deklaracji element) dla elementów, które posiadają kwalifikacje w danej instancji.

Ale nie wszystkie pasują w przeciwnym kierunku; schemat deklaruje element, którego rozwinięta nazwa to {http://schemas.servicestack.net/types}GetProductsResult, ale nie ma takiego elementu w instancji input (istnieje GetProductsResult, ale nie jest to kwalifikacja obszaru nazw).

Może chcesz zobaczyć, co się stanie, jeśli zmieni XML tak, że pierwszy start-tag czyta

<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

To był bilet! Przestrzenie nazw G'dang rujnują mój dzień ... Dziękuję za szybką odpowiedź! =) – MrWizard

1

Pierwsza reguła do naśladowania powinny zawsze być: zweryfikować XML przeciw XSD. W twoim przypadku brzmi to tak, jakbyś musiał zmienić swój XSD zamiast XML tylko dlatego, że wydajesz się próbować dopasować swój XSD do swojego XML - powiedziałeś downloaded from a supplier.Twoje rozwiązanie powinno raczej działać z plikiem dostawcy, ponieważ jeśli chcesz później ponownie załadować swój plik, nie chcesz go zmieniać, aby pasował do tego, co wydaje się być wadliwym XSD.

Rzeczywiście wydaje się, że potrzebujesz co najmniej dwóch plików XSD: jeden definiuje schemat bez docelowej przestrzeni nazw i importuje inny schemat, który jest kierowany na http://schemas.servicestack.net/types. Istnieje spora liczba opcji umożliwiających wygenerowanie XSD poza XML i sprawdzanie poprawności XML na XSD.

+0

To naprawdę ma sens. Obecnie jest to bardziej poprawa, aby działało, podczas gdy dostawca pracuje nad udostępnieniem nam XSD do sprawdzenia. Nie wolę pracować, ale co zrobić, gdy chcemy sprzedawać swoje produkty ... – MrWizard

Powiązane problemy