2011-08-23 4 views
14

ストアドプロシージャベースのレポートルーチンをC#で実行するよう変換中です。一般的な考え方は、C#/ .NET Frameworkのすべての驚異を使い、その結果をDBに戻すことです。私は昨日逃げ出した問題を除いて、すべてがうまくいっています。SqlBulkCopyによる列名の使用

インポートを行うには、プログラムでDataTableを作成し、SqlBulkCopyを使用して結果をサーバーに移動します。

DataTable detail = new DataTable(); 
detail.Columns.Add(new DataColumn("Stock", Type.GetType("System.Decimal"))); 
detail.Columns.Add(new DataColumn("Receipts", Type.GetType("System.Decimal"))); 
detail.Columns.Add(new DataColumn("Orders", Type.GetType("System.Decimal"))); 

インポートテーブルのフィールドの順序は、次のとおりです。

... 
Stock decimal(18,4), 
Orders decimal(18,4), 
Receipts decimal(18,4) 
... 

本質的に、領収書の値は注文に入り、その逆もあります。

明らかに、これはSqlBulkCopyが列挙した列名を尊重していないように見えるため、明らかに序数の位置になります。

私はRedgateのSQL Compareを使用しているので、これは問題です。あるデータベースから別のデータベースに変更をプッシュする場合、列の順序の位置は必ずしも維持されません。 (たとえば、新しい列を3番目の序数フィールドとして挿入した場合、SQL Compareはそれを同期のテーブルに追加して最後の列にします)。

これは私の解決策に真剣に迷い込んでいます。さて、これらは「インポート」テーブルだけなので、必要に応じて、順序付けされた位置をそのままの状態で移行スクリプトの一部として削除して再作成することができます。私はむしろそれをやっていないだろう。

強制的にSqlBulkCopyで記入した列名を守る方法はありますか?

+0

P.S.には、新しい列の同期中に列の順序を同じに保つ「強制列順序」というプロジェクトオプションがRed Gate SQL Compareにあります。 (あなたには、テーブルを落として再構築する必要がありますが、絶対に必要な時は過去に私のためにうまくいきました) – Funka

答えて

14

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.columnmappings.aspxから:

列数が異なる、または序数位置は 一貫していない場合は、あなたは、データが正しい列に コピーされていることを確認するにColumnMappingsを使用する必要があります。サンプルコードについては

は、私は何かが足りない可能性がありますhttp://www.sqlteam.com/article/use-sqlbulkcopy-to-quickly-load-data-from-your-client-to-sql-server

+0

まさに私が必要としていたものです。ありがとう。 –

+0

以下の私の答えは、注文の問題を解決します。:) – ttomsen

+0

私が欲しいものを除いて(列数の差) –

0

で「マッピング列」を参照してくださいが、なぜあなたは、列の順序を変更することができませんでしたか?私は通常、手でDataTableを作りません。私はのFillSchemaメソッドを使用し、"select * from targetTable"クエリを使用します。だから私はいつも私のDataTableが目標テーブルに合っていると確信しています。

1

[プロジェクトのオプション]で[SQLと強制的に比較する]オプションがあります。これにより、列の順序を変更するスクリプトが生成されます。私は間違っているかもしれませんが、この操作ではテーブルを再構築する必要があると思われますので、パフォーマンスに影響する可能性があるので注意して使用してください。ただし、スクリプトはテーブルデータを保持します。

9

ここで、この「バグ」を解決する方法を示します。

デフォルトでは序数/位置でマップされます。

私のケースでは、ランダムな順序で列を含むスプレッドシートからロードしていました。あなたが見ることができるように、ここでクイックフィックス(表は「序順不同で」であり、かつバルク・コピーはSqLBulkCopyオブジェクトである私のDataTableです)

foreach (DataColumn col in table.Columns) 
{ 
    bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); 
} 

だ、私はちょうど、名前で順序を直すことを強制しています名前は同じですが。

+0

これは数時間私を節約!どうもありがとう... –

関連する問題