SqlBulkCopy 无法将数据库表上的“0”、“1”布尔值解析为 BIT

SqlBulkCopy unable to Parse "0", "1" bool values into BIT on database table

提问人:Panks 提问时间:10/8/2010 最后编辑:gbnPanks 更新时间:10/27/2020 访问量:2675

问:

我正在使用我的自定义CSVDataReader:IDataReader {}在数据库表中插入批量值。

除了 Bit 之外的每个数据类型(来自“1”/“0”)都被完美地解析。在将 0 或 1 解析为 bool 时,我收到以下错误“数据源中 String 类型的值无法转换为 bit 类型”

如果我将这些值更改为“true”/“false”。它没有任何问题。

我无法更改 CSV 文件。目前,我在迭代期间将该特定列从“0”/“1”替换为“false”/“True”。但这不是一个优雅的解决方案。

请帮忙!

谢谢 潘克斯

SQL-Server 类型 转换

评论


答:

0赞 gbn 10/8/2010 #1

我猜你是在发送,而不是和"1""0"10

仅供参考,SQL Server 将接受 和 位truefalse

评论

1赞 Panks 10/8/2010
CSVDataReader 使用 StreamReader 读取文件,它逐行读取并将每行解析为字符串。因此,所有列值都是字符串。this.stream = new StreamReader(文件名);在 Read() 方法中,我拆分了行 string[] currentRow = stream。ReadLine() 中。分裂(',');
0赞 gbn 10/8/2010
SQL不会解析“true”或“false”带引号,所以有些不同
0赞 Philip Atz 10/27/2020 #2

我遇到了类似的问题,匿名类型无法填充我的数据库表。事实证明,my 中字段的顺序与数据库表中列的顺序不匹配。在这一点上,我不明白为什么列的顺序应该很重要,因为列名可用于正确匹配它们。IEnumerableDataTable

无论如何,我的列不匹配是使用 NuGet 包快速填充 的副作用,它按字母顺序对列进行排序!解决方案是将我的匿名类型替换为一个在其属性上使用该特性的小型声明类:FastMemberDataTableOrdinal

public class Row
{
    [Ordinal(0)] public string ColumnA { get; set; }
    [Ordinal(1)] public string SecondColumn { get; set; }
    [Ordinal(2)] public string ColumnC { get; set; }
}

您可以在此处阅读有关此排序问题的更多信息,其中用户 dyatchenko 创建了一个拉取请求来支持自定义属性排序。这最终被合并回 master。

评论

1赞 Jeroen Mostert 10/27/2020
列的顺序很重要,因为这就是它的业务方式,错误地试图尽可能地对本机功能进行建模(做同样的事情)。不过,您可以轻松地通过属性覆盖它(将每一列映射到自身)。在后台使用批量复制的所有内容都应该提供某种设置此属性的方法(或者最好只是理所当然地进行自映射)。SqlBulkCopybcpSqlBulkCopy.ColumnMappings
0赞 Philip Atz 10/27/2020
好的,谢谢,我以前用过,但那是很久以前的事了,我已经忘记了。谢谢你提醒我!我想在这种情况下不需要。ColumnMappingsOrdinal