5

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投稿が何らかの形でオフになっている場合は申し訳ありませんが、ここに投稿するのは初めてですが、調査を行い、投稿方法のガイドラインに従おうとしました=))

4

2 に答える 2

1

名前空間の問題があるかもしれないというあなたの疑いのフォローアップ...

名前空間は、インスタンスで修飾されている要素と(要素インスタンスと要素宣言の間で)一致します。

しかし、それらはすべて他の方向に一致するわけではありません。スキーマは、展開された名前が{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" >
于 2012-10-10T15:41:27.063 に答える
1

従うべき最初のルールは常に次のとおりです。XSDに対してXMLを検証します。あなたの場合、XSDをXMLに一致させようとしているように見えるという理由だけで、XMLではなくXSDを変更する必要があるように思えますdownloaded from a supplier。後でファイルをリロードしたい場合は、欠陥のあるXSDと思われるものに合うようにファイルを変更し続けたくないので、ソリューションはむしろサプライヤーのファイルで機能するはずです。

実際には、少なくとも2つのXSDファイルが必要なようです。1つはターゲット名前空間のないスキーマを定義し、もう1つはをターゲットとする別のスキーマをインポートしますhttp://schemas.servicestack.net/types。XMLからXSDを生成し、XSDに対してXMLを検証できるようにするためのオプションは多数あります。

于 2012-10-10T17:03:40.193 に答える