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;

在 WriteToServer 行上引发异常,并且取决于是否typeof(bool)指定:

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并且不允许为空值。

有什么想法可以让我的布尔值起作用吗?

编辑:刚刚发现并尝试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

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 回答