c# - SQLXML BulkLoader no arroja ningún error pero no se insertan datos
xsd (2)
La primera regla a seguir siempre debe ser: validar su XML contra 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, dijo que lo downloaded from a supplier
. Su solución debería funcionar con el archivo del proveedor, ya que si desea volver a cargar el archivo más tarde, no desea seguir cambiando para que se ajuste a lo que parece ser un XSD defectuoso.
De hecho, parece que 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.
Estoy tratando de usar SQLXMLBulkLoader4 desde el 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 errores que no causen su bloqueo), pero no se informa ningún error.
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 (eliminé los valores reales de la cadena de conexión):
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 se ve así (despojado, todo lo que se muestra a continuación es solo un par de campos de productos más y 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í se ve así (acortado de nuevo):
<?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 el 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.
Es probable que sea algo fácil que estoy pasando por alto, pero no lo estoy viendo en absoluto.
Cualquier ayuda que me apunte en la dirección correcta es profundamente bienvenida.
¡Gracias de antemano!
(PD: Lo siento si la publicación está desactivada de alguna manera, es la primera vez que publico aquí, hice mi investigación, sin embargo, e intenté seguir las pautas sobre cómo publicar =))
Siguiendo con 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 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 qué sucede si cambia el XML para que se lea la primera etiqueta de inicio.
<GetProductsResult
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.servicestack.net/types" >