データテーブルとSqlBulkCopyを使用してSQLにブール値を書き込む例外を取得する

c# datatable sqlbulkcopy sql-server

質問

それは他のすべてのデータ型でうまく動作しますが、私はそれを 'ビット'列で動作させることができません。

これは、一括書き込みを行うための私の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;

例外はWriteToServer行でスローされ、 typeof(bool)が指定されているかどうかによって次のいずれかが発生します。

Cannot insert the value NULL into column 'MyBool', tableCannot insert the value NULL into column 'MyBool', table / debuggerは値をtrueとして表示し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が動作することを示唆していますが、そうではありません。

編集:私は問題がそれに潜んでいるデータベースがint型であると思っている疑いがあります。紫色のクレヨンがタイプであることは明らかbit 。したがって、そのタイプのメッセージは基本型int変換されません。

受け入れられた回答

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

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


人気のある回答

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

foreach (DataColumn column in table.Columns) {
    sqlBulk.ColumnMappings.Add(column.ColumnName, column.ColumnName);
}
sqlBulk.WriteToServer(table);


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ