2012-10-10 90 views
5

Estoy tratando de usar SQLXMLBulkLoader4 del código C# en un SQL 2008 DB. Pero por alguna razón, no inserta ninguna fila a pesar de no arrojar ningún error. He utilizado el propio archivo ErrorLog de bulkloads (para comprobar si hay algún error que no lo haya bloqueado), pero no se informa ningún error.SQLXML BulkLoader no arroja ningún error pero no se insertan datos

Tengo un archivo XML que se descarga de un proveedor (básicamente una lista de productos), escribí un XSD para unir los campos a nuestro DB. No hay nada más escribiendo en esas tablas específicas, y nada más usando esos archivos.

Mi código bulkload se ve de la siguiente manera (I X'ed los valores de cadena de conexión reales):

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

    } 

El XML es el siguiente (simplificada, todo lo siguiente es sólo un par de productos y campos luego más productos):

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

El XSD que escribí es similar al siguiente (de nuevo): acortada

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

Me he quedado ciego en los espacios de nombres, pero me parecen correctos. (Lea sobre muchos errores similares en los que la causa es la existencia de diferentes espacios de nombres). El código se está ejecutando desde mi computadora, tanto mi computadora como la de la base de datos tienen acceso a la carpeta de red con los archivos XML y XSD.

He intentado cambiar deliberadamente algunos nombres de campo en ambos archivos, y BulkLoader se enciende arrojando un error en el campo que acabo de cambiar.

He comparado tanto mi código BulkLoader como el XSD con ejemplos que he encontrado en la red, y no encuentro ninguna diferencia que pueda explicar este comportamiento.
Probablemente sea algo fácil que estoy pasando por alto, pero simplemente no lo estoy viendo.

Cualquier ayuda que me apunte en la dirección correcta es muy bienvenida.

¡Gracias de antemano!

(PS Lo siento si el mensaje es fuera de alguna manera, es mi primera vez publicar aquí, que hice mi investigación y sin embargo me trató de seguir las directrices sobre cómo publicar =))

Respuesta

1

Siguiendo en su sospecha de que podría haber un problema de espacios de nombres ...

Los espacios de nombres coinciden (entre la instancia del elemento y la declaración del elemento) para los elementos que están calificados en la instancia.

Pero no todos coinciden en la otra dirección; el esquema declara un elemento cuyo nombre expandido es {http://schemas.servicestack.net/types}GetProductsResult, pero no aparece ese elemento en la instancia de entrada (hay un GetProductsResult, pero no está calificado para el espacio de nombres).

Es posible que desee ver lo que sucede si se cambia el código XML de manera que la primera etiqueta inicial lee

<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

¡Esa fue la entrada! Espacios de nombres de G'dang arruinando mi día ... ¡Gracias por la respuesta rápida! =) – MrWizard

1

Primera regla a seguir debe ser siempre: validar el XML en contra de su XSD. En su caso, parece más como si tuviera que cambiar su XSD en lugar de su XML simplemente porque parece que intenta ajustar su XSD para que coincida con su XML - usted dijo downloaded from a supplier.Su solución debería funcionar con el archivo del proveedor, ya que si desea volver a cargar su archivo más tarde, no desea seguir cambiando para que se ajuste a lo que parece ser un XSD defectuoso.

Parece que realmente necesita al menos dos archivos XSD: uno define un esquema sin un espacio de nombres de destino e importa otro esquema que se dirige a http://schemas.servicestack.net/types. Hay bastantes opciones para permitirle generar un XSD a partir de un XML y validar un XML contra un XSD.

+0

Eso tiene mucho sentido en realidad. Como es ahora, esto es más una solución para que funcione mientras el proveedor trabaja en proporcionarnos un XSD para validar. No es cómo preferiría trabajar, sino qué hacer cuando queremos vender sus productos lo antes posible ... – MrWizard

Cuestiones relacionadas