c# - SQL Server - 无法将值 0 或 1 导入位列

标签 c# sql-server csv sql-server-2014 sqlbulkcopy

这似乎是一个重复的问题。但是在搜索和查看相关问题和答案时,我仍然找不到答案。

我正在编写一个加载程序,它将数据记录从 CSV 文件导入到数据库表中。这是演示。

数据库表如下:

use Test;
create table BoolTest (Name varchar(20) not null, IsValid bit not null);
insert into BoolTest (Name, IsValid) values('xx', 1);
insert into BoolTest (Name, IsValid) values('yy', 0);

加载程序是这样的:

class Program
{
    static void Main(string[] args)
    {
        var csvFileContent = "Name,IsValid\r\naa,true\r\nbb,false";            
        var csvLines = csvFileContent.Split(new String[] { "\r\n" }, StringSplitOptions.None);
        var columnNames = csvLines[0].Split(',');

        var table = new DataTable();
        foreach (var columnName in columnNames)
        {
            table.Columns.Add(new DataColumn(columnName));
        }

        for (var n = 1; n < csvLines.Length; ++n)
        {
            var line = csvLines[n];
            var values = line.Split(',');
            table.Rows.Add(values);
        }

        var connectionString = "Data Source=localhost;Initial Catalog=Test;Integrated Security=True";
        using (var bulkCopy = new SqlBulkCopy(connectionString)) {
            bulkCopy.DestinationTableName = "BoolTest";

            bulkCopy.ColumnMappings.Add("Name", "Name");
            bulkCopy.ColumnMappings.Add("IsValid", "IsValid");

            bulkCopy.WriteToServer(table);
        }

        Console.WriteLine("Done");
        Console.Read();
    }
}

上面一切正常

但问题是 CSV 文件来自第三方,“IsValid”列的值为 0 或 1,如下所示

Name,IsValid
aa,1
bb,0

当加载程序尝试加载此 CSV 文件时,bulkCopy.WriteToServer(table) 将抛出异常

enter image description here

我使用的sql server是Sql server 2014。

任何帮助将不胜感激。谢谢。

---更新---

感谢大家提供解决方案。我将尝试在加载程序中手动将 0/1 更改为 false/true。但仍然想知道这个问题是否有简单的修复方法(比如更改 SQL Server 或 SqlBulkCopy 中的设置)。

我也在 Sql Server Management Studio 中试过 sql 之类的

insert into BoolTest (Name, IsValid) values('aa', 1); -- this works as we expected

insert into BoolTest (Name, IsValid) values('aa', '1'); -- this also works to my surprise

两者都很好。但不知道为什么当 IsValid 值为 0 或 1 时 SQL Server 拒绝批量复制。当我们使用 'select' 显示表数据时,IsValid 的值实际上是 0 或 1。

最佳答案

这是因为 bool 值在插入时被位值替换,为了让我们的生活更容易解决这个问题,您只需要创建一个将位转换为 bool 值的解析方法,非常简单。然后应该工作

关于c# - SQL Server - 无法将值 0 或 1 导入位列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37129673/

相关文章:

php - 如何使用 PHP 解析 CSV 文件

c# - 向 linux 中的另一个应用程序发送消息

c# - Windows 性能计数器从 PerfMon 中消失

c# - 不使用正则表达式检查特殊字符

c# - 正确地将 C++ long 转换为 C# int

java - Talend 中的增量模式

c# - BizTalk 服务器问题

csv - pyspark csv位于数据帧的url,而不写入磁盘

sql - 为什么@@Identity 返回 null?

python - 如何解决导出到 csv 文件时的 unicode 错误 (python)