質問

I’ null許容列が含まれる場合、SqlBulkCopyを使用すると問題が発生します。 SqlBulkCopyは、null許容列の処理方法を認識しておらず、長さゼロの列に遭遇すると、不正なサイズエラーをスローするようです。エラーは" BCPクライアントから無効な列の長さを受け取りました..."

私はこれに対処するためのベストプラクティスは何であるか疑問に思っています。 これこの問題と、csvファイルを読み取るためにそれを解決する方法を説明する良いフォーラム投稿になります。

私の状況はかなり典型的でシンプルだと思います。あるデータベーステーブルから別のデータベースにデータの未知の量を移動する必要があります。私にとってより簡単な答えは、SSIS / DTSまたはSQL Serverのリンクサーバーを使用することですが、顧客はアプリにデータの移動を望んでいます。

これを回避するための既知の回避策や、null許容フィールドを含むデータを移動するためのより優れた解決策はありますか?

//access db
string src_db = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SourceDB.mdb;Jet OLEDB ";
//sql db
string dest_db = @"Data Source=.\TEST;Initial Catalog=testdb;User Id=user;Password=password;";
string sql = "";
OleDbConnection sdb = new OleDbConnection( src_db );
OleDbCommand cmd = new OleDbCommand( sql, sdb );
OleDbDataReader rs = null;

SqlConnection db = new SqlConnection( dest_db );
SqlCommand clear = null;
SqlBulkCopy bulk_load = null;

// Read in the source table
sql = "select * from someTable";
sdb.Open();
cmd = new OleDbCommand( sql, sdb );
rs = cmd.ExecuteReader();

// Import into the destination table
bulk_load = new SqlBulkCopy( db );
bulk_load.DestinationTableName = "test";
bulk_load.WriteToServer( rs );
役に立ちましたか?

解決

SqlBulkCopyクラスは、nullフィールドを処理できません。フィールドの長さを計算する前に、フィールドがnullかどうかをチェックしません。したがって、エラーがスローされます。

質問で引用した投稿は、null値の代わりにDBNull.ValueをスローするIDataReaderの実装を参照しています。これは、SqlBulkCopyの問題を回避します。

他のヒント

問題の宛先フィールドにnullableがチェックされている場合に機能します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top