6

他のすべてのデータ型では正常に機能しますが、「ビット」列では機能しません。

これは、一括書き込みを行うための私の SQL です。

using (var bulk = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls))
{
    bulk.BatchSize = 2000;
    bulk.DestinationTableName = targetTable;
    bulk.WriteToServer(dataTable);
}            

これは私のデータテーブルです:

    DataTable dt = new DataTable();

    dt.Clear();

    dt.Columns.Add("MyBool", typeof(bool)); // Tried with and without typeof(bool)

    return dt;

これは、データテーブルに追加する前に行を作成する方法です。

personAssociationRow["MyBool"] = true;

typeof(bool)例外は WriteToServer 行でスローされ、指定されているかどうかに応じて、次のいずれかになります。

Cannot insert the value NULL into column 'MyBool', tableしかし、インテリセンス/デバッガーは値を次のように表示しますtrue

また

The given value of type String from the data source cannot be converted to type int of the specified target column.これは、インテリセンス/デバッガーの値が"True"文字列になるときです。

データベースでは、列は として定義されてbitおり、NULL は許可されていません。

ブール値を機能させる方法はありますか?

SqlBoolean編集:タイプとしても見つけて試してみましたThe given value of type SqlBoolean from the data source cannot be converted to type int of the specified target column.が、それは機能しませんでした.intが機能することを示唆していますが、そうではないようです.

編集: 問題は、基になるデータベースが typeintであることが紫色のクレヨンのように明らかな場合にtype であると考えることにあると思われbitます。したがって、基になる type に変換されないというエラー メッセージが表示されますint

4

3 に答える 3

2

同じ問題が発生しました: bool 列を true/false に設定すると、一括コピーでは無視され、すべての値が null に設定されました。前の回答はそれを解決するのに役立ちましたが、それを機能させるにはすべての列のマッピングを追加する必要がありました:

foreach (DataColumn column in table.Columns) {
    sqlBulk.ColumnMappings.Add(column.ColumnName, column.ColumnName);
}
sqlBulk.WriteToServer(table);
于 2015-06-03T21:59:39.260 に答える
0

あなたは言う:SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls

あなたが意味したのは:SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.KeepNulls

最初のものはゼロに評価されます。

于 2013-08-30T10:58:13.320 に答える
0

修正しましたが、マッピングの問題であることが判明しました。何らかの理由で、他の 20 個のテーブルはすべて完全に正常にマップされましたが、このテーブルは次を追加するまで正しくマップされませんでした。

bulk.ColumnMappings.Add("Ex", "Ex");

于 2013-08-30T12:07:48.080 に答える