3

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

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

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

これに対する既知の回避策や、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 );
4

3 に答える 3

5

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

質問で引用した投稿は、null 値だけでなく DBNull.Value をスローする IDataReader の実装を参照しています。これは、SqlBulkCopy の欠陥を回避します。

于 2009-11-23T12:34:20.897 に答える
0

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

于 2009-10-25T04:19:33.093 に答える
0

null許容値をチェックすると、多くのことが解決されます。しかし、データベースで null にできない DateTime 値にはまだ問題がありました。私のソースは CSV であるため、値が null になる可能性があります。C# の日時の最小値と Sql の最小値が異なるため、Null 値を DateTime.MinValue に設定することは解決策ではありませんでした。

宛先列を DateTime2 に設定することで、DateTime 列に関するすべての問題が解決されました。他の列 (int など) は問題なく null にすることができます。

于 2020-02-13T12:37:08.663 に答える