2016-05-10 3 views
4

Это похоже на дублирующий вопрос. Но по мере того как я искал & просмотрел связанные вопросы & ответов, я все еще не могу найти ответ.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 от 3 участника и значения для столбца «IsValid» является 0 или 1, как показано ниже

Name,IsValid 
aa,1 
bb,0 

Когда программа загрузчик пытается загрузить этот файл CSV, bulkCopy.WriteToServer (таблица) выбросит исключение

enter image description here

сервер SQL я использую Sql сервер 2014.

Любая помощь будет быть оцененным. Благодарю.

--- обновление ---

Спасибо, ребята, за решения. Я попытаюсь вручную изменить 0/1 на false/true в программе загрузчика. Но все же вы хотите знать, есть ли легкое исправление (например, изменение настроек в SQL Server или SqlBulkCopy) для этой проблемы.

Я также попытался SQL в SQL Server Management Studio, как

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 

И работает хорошо. Но не знаете, почему SQL-сервер отклоняет массовую копию, когда значение IsValid равно 0 или 1. И когда мы показываем данные таблицы с помощью «select», значение для IsValid на самом деле равно 0 или 1.

+1

Попробуйте TRUE, FALSE вместо 1,0. –

+0

@AbdulRasheed Да, true/false в порядке для программы. Но файл csv принадлежит другой компании, а значение равно 0/1. – yyou

+1

@yyou Тогда вам нужно будет сообщить им, чтобы они отправили его с помощью 'true' /' false', или вам нужно, чтобы ваша программа заменила значения соответствующим образом. – Rob

ответ

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])); 
} 
1

Заявление INSERT работать на SQL уровне:

INSERT INTO BoolTest (Name, IsValid) VALUES ('xx', 1); 
INSERT INTO BoolTest (Name, IsValid) VALUES ('yy', 0); 

Но когда вы передаете значения до хранимой процедуры или SQL заявление, вы не можете пройти через 0 или 1, так как она будет проходить через как 0 или 1 (и принято как таковое). Это должно быть истинным или ложным, которое будет пройдено.

Я думаю, что это, где вы разделяете значения строки:

var values = line.Split(','); 

Все, что вам нужно сделать здесь, чтобы проверить на 0 и 1, а затем заменить их с ложным или истинным, соответственно, ,

2

Это потому, что значения Boolean заменяются битовыми значениями на вставке, чтобы упростить нашу жизнь, вам просто нужно создать метод разбора для преобразования бит в bool, достаточно простой.Должно ли тогда работать

Смежные вопросы