2016-05-10 20 views
4

nicht importieren Das scheint wie eine doppelte Frage. Aber als ich suchte & sah die verwandten Fragen & Antworten, ich kann immer noch nicht die Antwort finden.SQL Server - kann Wert 0 oder 1 in Bitspalte

Ich schreibe ein Ladeprogramm, das Datensätze aus einer CSV-Datei in eine Datenbanktabelle importiert. Hier ist die Demo.

Die Datenbanktabelle ist etwas wie unten:

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); 

Das Ladeprogramm ist wie:

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(); 
    } 
} 

Alles ist oben in Ordnung.

Aber das Problem ist die CSV-Datei ist von 3rd-Party und die Werte für die Spalte ‚IsValid‘ 0 oder 1, wie unten

Name,IsValid 
aa,1 
bb,0 

Wenn das Ladeprogramm versucht, diese CSV-Datei zu laden, bulkCopy.WriteToServer (Tabelle) wird werfen Ausnahme

enter image description here

Der sQL-Server ich verwende ist sQL Server 2014

Jede Hilfe wird geschätzt werden. Vielen Dank.

--- update ---

Danke Jungs für die Lösungen. Ich werde versuchen, 0/1 im Loader-Programm manuell auf falsch/wahr zu setzen. Aber ich möchte immer noch wissen, ob es eine einfache Lösung für dieses Problem gibt (wie das Ändern der Einstellungen in SQL Server oder SqlBulkCopy).

Ich habe auch versucht SQL in SQL Server Management Studio wie

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 

Beide gut funktioniert. Aber nicht sicher, warum SQL-Server die Massenkopie ablehnt, wenn der IsValid-Wert 0 oder 1 ist. Und wenn wir die Tabellendaten mit 'Select' anzeigen, ist der Wert für IsValid tatsächlich 0 oder 1.

+1

Versuchen TRUE, FALSE statt 1,0. –

+0

@AbdulRasheed Ja, wahr/falsch ist in Ordnung für das Programm. Aber die CSV-Datei stammt von einer anderen Firma und der Wert ist 0/1. – yyou

+1

@ yyou Dann müssen Sie ihnen sagen, es mit 'true' /' false' zu ​​senden, oder Sie müssen Ihr Programm die Werte entsprechend ersetzen lassen. – Rob

Antwort

1

Ich denke, der Fehler wird durch den Versuch verursacht, einen String (Zellenwert in der DataTable) in eine BIT-Spalte zu schieben, da Massen einfügen nicht implizit Konvertierungen durchführen kann ("0" und "1" -Werte) in 0/1 BIT-Werte).

Eine Möglichkeit ist die manuelle Spalten definieren zusammen mit ihrem tatsächlichen Typ:

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

und der Bau Zellen etwas wie folgt aus:

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

Die folgende INSERT Anweisung wird arbeiten auf einem SQL Ebene:

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

Aber wenn man Werte bis hin zu der gespeicherten Prozedur oder SQL-Anweisung sind vorbei, können Sie nicht, wird eine 0 oder eine 1, weil es als 0 oder 1 durch passieren (und so akzeptiert). Es muss ein wahres oder ein falsches sein, das weitergegeben wird.

Ich denke, das ist, wo Sie die Zeilenwerte aufgeteilt:

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

Alles, was Sie hier tun müssen, ist für eine 0 zu testen und eine 1, und sie dann ersetzen mit einem falschen oder einer wahren bzw. .

2

Weil boolesche Werte beim Einfügen durch Bitwerte ersetzt werden, um unsere Leben einfacher zu machen, müssen Sie nur eine Parsingmethode zum Konvertieren von Bit in Bool erstellen, einfach genug.Sollte dann funktionieren