C#コードからSQL2008DBにSQLXMLBulkLoader4を使用しようとしています。しかし、何らかの理由で、エラーをスローしなくても、行はまったく挿入されません。バルクロード独自のErrorLogファイルを使用しましたが(クラッシュを引き起こさない可能性のあるエラーをチェックするため)、エラーは報告されません。
サプライヤからダウンロードしたXMLファイル(基本的には製品のリスト)があり、フィールドをDBに一致させるために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" />
私は名前空間を盲目的に見つめてきましたが、それらは私には正しいように見えます。(異なる名前空間が原因である多くの同様のエラーについて読んでください)。コードは私のコンピューターから実行されています。私のコンピューターとDBを備えたコンピューターの両方が、XMLファイルとXSDファイルを含むネットワークフォルダーにアクセスできます。
両方のファイルのいくつかのフィールド名を意図的に変更しようとしましたが、BulkLoaderがフレアして、変更したばかりのフィールドにエラーをスローします。
BulkLoaderコードとXSDの両方をネット上で見つけた例と比較しましたが、この動作を説明する違いは見つかりませんでした。
それはおそらく私が見落としている簡単なことですが、私はそれをATMで見ていません。
私を正しい方向に向ける助けがあれば、大歓迎です。
前もって感謝します!
(PS投稿が何らかの形でオフになっている場合は申し訳ありませんが、ここに投稿するのは初めてですが、調査を行い、投稿方法のガイドラインに従おうとしました=))