SQL Server - 값 0 또는 1을 비트 열로 가져올 수 없습니다.

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

문제

이것은 중복 된 질문처럼 보입니다. 그러나 검색 및 관련 질문 및 답변을 볼 때, 나는 여전히 대답을 찾을 수 없습니다.

데이터 레코드를 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)가 예외를 발생시킵니다.

여기에 이미지 설명을 입력하십시오.

내가 사용하고있는 SQL 서버는 SQL 서버 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입니다.

수락 된 답변

나는 대량 삽입이 암시 적 변환 ( "0"및 "1"값을 0/1 BIT 값으로) 수행 할 수 없기 때문에 오류가 DataTable의 String (셀 값)을 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]));
}

인기 답변

부울 값이 삽입시 비트 값으로 바뀌므로 삶을 더 쉽게 고칠 수 있도록하기 위해 비트를 bool로 변환하기위한 파싱 메서드를 만드는 것만으로 충분합니다. 그 때 일해야한다



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.