使用DataTable和SqlBulkCopy将布尔值写入SQL时出现异常

6

对于所有其他数据类型,它都可以正常工作,但我无法使其与“bit”列一起正常工作。

这是我用于批量写入的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;

这是我在添加到datatable之前构建行的方法。 personAssociationRow["MyBool"] = true;
异常是在WriteToServer行上抛出的,取决于是否指定了typeof(bool):
当值为true时,会显示"Cannot insert the value NULL into column 'MyBool', table",但是智能感知/调试器将其显示为true;
当值为"True"字符串时,会显示"The given value of type String from the data source cannot be converted to type int of the specified target column."。
在数据库中,该列被定义为bit类型且不允许为空值。
有什么想法可以解决这个布尔值问题吗?
编辑:刚找到并尝试过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。

尝试使用int数据类型,将0用作false的值,将1用作true的值,而不是使用bool - Andrey Gordeev
Tries,说不允许NULL。 - NibblyPig
3个回答

2

遇到了同样的问题:使用批量复制将bool列设置为true/false被忽略,所有值都被设置为null。之前的答案帮助解决了这个问题,但我不得不添加所有列的映射才能使其正常工作:

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

0
你说: SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls 你的意思是: SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.KeepNulls 第一个表达式的值为零。

这是两个属性的按位包含。 - NibblyPig
@SLC 不是,这是按位与。你需要按位或来设置两个位。 - usr
有趣的是,我从另一个SO问题中复制了它,我会进行修改。 - NibblyPig
不确定那是否能解决你的问题,但肯定是个漏洞。 - usr

0

我已经解决了,原来是一个映射问题。由于某种原因,其他20个表都映射得非常好,但是这个表在我添加以下内容之前没有正确映射:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接