2013-08-30 13 views
5

Działa to dobrze dla wszystkich innych typów danych, ale nie jestem w stanie zmusić go do pracy z kolumną "bitową".Uzyskiwanie wyjątku przy zapisywaniu wartości boolowskiej do sql przy użyciu datatable i SqlBulkCopy

To jest mój SQL za to write luzem:

using (var bulk = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls)) 
{ 
    bulk.BatchSize = 2000; 
    bulk.DestinationTableName = targetTable; 
    bulk.WriteToServer(dataTable); 
}    

To mój DataTable:

DataTable dt = new DataTable(); 

    dt.Clear(); 

    dt.Columns.Add("MyBool", typeof(bool)); // Tried with and without typeof(bool) 

    return dt; 

ten sposób skonstruować wiersz przed dodaniem do DataTable.

personAssociationRow["MyBool"] = true;

jest wyjątek na linii WriteToServer, w zależności od, jeśli typeof(bool) określona jest:

Cannot insert the value NULL into column 'MyBool', table ale IntelliSense/debugera wykazuje wartość jako true

lub

The given value of type String from the data source cannot be converted to type int of the specified target column., która jest, gdy wartość w intellisense/debugger staje się "True" czyli stri ng.

W bazie danych kolumna jest zdefiniowana jako bit i nie zezwala na wartości null.

Jakieś pomysły, w jaki sposób mogę uzyskać mój Boolean do pracy?

Edycja: Właśnie znalazłem i wypróbowałem SqlBoolean jako typ również, ale to nie zadziałało, to powiedział The given value of type SqlBoolean from the data source cannot be converted to type int of the specified target column. co sugeruje, że int zadziała, ale nie wydaje się.

Edit: Podejrzewam, że problem leży w jego myśli samej bazy danych jest typu int gdy jest jasne, jak fioletowy kredką, że typ jest bit, stąd komunikat o błędzie o to nie konwersja do podstawowego typu int.

+0

Spróbuj użyć 'int' datatype z' 0' dla 'false' i' 1' dla 'true 'wartości zamiast' bool' –

+0

Tries, mówi nie zezwala na NULL – NibblyPig

Odpowiedz

0

Naprawiłem, okazało się, że to problem z mapowaniem. Z jakiegoś powodu, wszystkie 20 inne stoliki odwzorowany całkowicie w porządku, ale ta tabela nie map prawidłowo aż dodałem następujące:

bulk.ColumnMappings.Add("Ex", "Ex");

0

Mówisz: SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls

Chciałeś: SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.KeepNulls

Pierwszy z nich ma wartość zero.

+0

Jest to bitowe uwzględnienie obu właściwości – NibblyPig

+0

@ SLC nie, jest to bitowe AND. Potrzebujesz bitowego OR, aby ustawić oba bity. – usr

+0

Interesujące, skopiowałem to z innego pytania SO, zmienię to – NibblyPig

1

napotkał ten sam problem: ustawienie kolumny bool true/false został zignorowany przez kopiowanie zbiorcze, wszystkie wartości zostały ustawione na wartość null. Poprzednia odpowiedź pomogła to rozwiązać, ale musiałem dodać mapowania dla wszystkich kolumn, aby to działało:

foreach (DataColumn column in table.Columns) { 
    sqlBulk.ColumnMappings.Add(column.ColumnName, column.ColumnName); 
} 
sqlBulk.WriteToServer(table); 
Powiązane problemy