数据库
首页 > 数据库> > c# – SQL Server – 无法将值0或1导入位列

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

作者:互联网

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

我正在编写一个加载程序,它将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(表)将抛出异常

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服务器会拒绝批量复制.当我们用’select’显示表数据时,IsValid的值实际上是0或1.

解决方法:

我认为错误是由于尝试将String(DataTable中的单元格值)推入BIT列而导致的,因为批量插入无法执行隐式转换(“0”和“1”值为0/1 BIT值) .

一种方法是手动定义列及其实际类型:

table.Columns.Add(new DataColumn("Name", typeof(String)));
table.Columns.Add(new DataColumn("IsValid", typeof(bool)));

和单元格构造如下:

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

    var rowValues = new object[values.Length];
    rowValues[0] = values[0];
    // conversion to integer is required as Boolean will not accept the string
    rowValues[1] = Convert.ToBoolean(Convert.ToInt32(rowValues[1]));
}

标签:c,sql-server,csv,sqlbulkcopy,sql-server-2014
来源: https://codeday.me/bug/20190623/1269112.html