2011-10-27 6 views
1

SqlBulkCopyを使用してXMLファイルをインポートする際にプロンプ​​トが表示されます。SqlBulkCopy - SQLテーブルへのXMLデータのインポート

<root> 
    <Automobiles> 
     <Car Id="1" Name="SomeModel1"/> 
     <Car Id="2" Name="SomeModel2"/> 
     <Car Id="3" Name="SomeModel2"/> 
    </Automobiles> 
    </root> 

私のテーブルには、次のようになります:ここで

Int   Id 
varchar Name 

が私のコードです:

DataSet ds = new DataSet(); 
ds.ReadXml(Server.MapPath("autolist.xml")); 

SqlConnection connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["Connection"].ToString()); 
SqlBulkCopy sbc = new SqlBulkCopy(connection); 
sbc.DestinationTableName = "Automobiles"; 

foreach (DataColumn dc in ds.Tables[0].Columns) 
{ 
    sbc.ColumnMappings.Add(dc.Caption, dc.Caption); 
} 

connection.Open(); 

sbc.WriteToServer(ds.Tables[0]); 

connection.Close(); 

私はそのために、名前IdをインポートしたができなかったXMLファイルは、次のようになりますDataSetには1つの列しか含まれていません。列に属性をマップする方法はありますか?

DataSetの代わりにXmlDocumentを使用するとよいでしょうか?

私は何が間違っていると思います。 Automobiles要素の周りにいくつかのルート要素があり、データセットテーブルに列がない場合、データセットはかなり異なっています。ルート要素なしでうまく動作します。

+1

私はあなたのコードをインポートしようとしましたが、DateSetは2つの列(IdとName)を持っていますので問題にはなりません。あなたのマッピングに何か問題が起こることはありますか? –

+0

コメントありがとうございます。私は私のマッピングを確認します – ilkin

答えて

3

私は通常、DataSetを使用してXMLデータをデータベースにインポートすることは嫌いです。 DataSetクラスは、そのデータをXMLとして構造化し、逆に他のXMLを読むという非常に特殊な方法を持っています。

私はIDataReaderの実装を取るWriteToServer overloadと呼んでいます。

IEnumerable<T>の実装を取り、それをIDataReaderにマッピングする拡張メソッドを簡単に作成できます。基本的には、クラスのプロパティを名前とインデックスでテーブルのフィールドにマップします。に対して作成するExpressionインスタンス(lambdaにコンパイルされたインスタンス)の配列へのインデックスでもあるインデックスは、Tのインスタンスを返します。プロパティ値

IDataReader.Readの実装をIEnumerable<T>.MoveNextメソッドにマップするのが一般的です。

このようなことができたら、XMLをテーブルを反映したライトオブジェクトデータオブジェクトにマップし、シーケンスをIDataReader実装にマップする拡張メソッドに渡すことができます。

+0

あなたの答えをありがとう。私はあなたの答えの後にいくつかの研究を行い、例を見つけました。 – ilkin

関連する問題