我正在尝试将C#代码中的SQLXMLBulkLoader4用于SQL 2008数据库。但由于某些原因,尽管没有抛出任何错误,它根本不会插入任何行。我已经使用了bulkloads自己的ErrorLog文件,(检查可能不会导致崩溃的任何错误),但是没有报告错误。
我有一个从供应商下载的XML文件(基本上是产品列表),我写了一个XSD来匹配我们数据库的字段。没有其他任何东西写入这些特定的表,没有其他任何使用这些文件。
我的BulkLoad代码如下所示(我X实际连接字符串值):
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看起来像这样(剥离,下面的所有内容只是几个产品领域,然后是更多产品):
<?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看起来像这样(再次缩短):
<?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" />
我盯着命名空间瞎了眼,但看起来对我来说是正确的。 (阅读很多类似的错误,其中不同的命名空间是原因)。 代码从我的计算机运行,我的计算机和数据库都可以访问带有XML和XSD文件的网络文件夹。
我曾尝试故意更改两个文件中的某些字段名称,并且BulkLoader突然在我刚刚更改的字段上抛出错误。
我已将我的BulkLoader代码和XSD与我在网上找到的示例进行了比较,但我找不到任何可以解释此行为的差异。
这可能是我容易忽视的东西,但我只是没有看到它。
任何帮助我指向正确方向的人都深受欢迎。
提前谢谢!
(P.S。抱歉,如果帖子以某种方式关闭,这是我第一次在这里发帖,我确实做了我的研究,但我确实尝试遵循如何发布的指导方针=))
答案 0 :(得分:1)
继续怀疑可能存在名称空间问题......
命名空间与实例中限定的元素匹配(在元素实例和元素声明之间)。
但他们并不是在另一个方向上匹配; schema声明了一个扩展名为{http://schemas.servicestack.net/types}GetProductsResult的元素,但输入实例中没有出现这样的元素(有一个GetProductsResult,但它不是名称空间限定的。)
您可能希望了解如果更改XML以便第一个开始标记读取
会发生什么<GetProductsResult
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.servicestack.net/types" >
答案 1 :(得分:1)
首先要遵循的规则应该是:针对您的XSD验证XML。在您的情况下,听起来更像是您必须更改XSD而不是XML,因为您似乎尝试使XSD适合您的XML - 您说downloaded from a supplier
。您的解决方案应该使用供应商的文件,因为如果您希望以后重新加载他们的文件,您不希望继续更改它以适应看似错误的XSD。
您实际上似乎至少需要两个XSD文件:一个定义没有目标命名空间的架构,并导入另一个针对http://schemas.servicestack.net/types
的架构。有许多选项可以让您从XML生成XSD,并根据XSD验证XML。