SQL Server - impossible d'importer une colonne de valeur 0 ou 1 en bits

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

Question

Cela semble être une question en double. Mais comme j'ai cherché et regardé les questions et réponses connexes, je ne trouve toujours pas la réponse.

J'écris un programme de chargement qui importe des enregistrements de données d'un fichier CSV dans une table de base de données. Voici la démo.

La table de base de données est quelque chose comme ci-dessous:

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

Le programme de chargement est comme:

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

Tout va bien dessus.

Mais le problème est que le fichier CSV provient d'une tierce partie et que les valeurs de la colonne 'IsValid' sont égales à 0 ou 1, comme indiqué ci-dessous.

Name,IsValid
aa,1
bb,0

Lorsque le programme de chargement tente de charger ce fichier CSV, bulkCopy.WriteToServer (table) lève une exception.

entrez la description de l'image ici

Le serveur SQL que j'utilise est le serveur SQL 2014.

Toute aide serait appréciée. Merci.

--- mettre à jour ---

Merci les gars pour les solutions. Je vais essayer de changer manuellement 0/1 en false / true dans le programme de chargement. Mais vous voulez toujours savoir s'il existe une solution simple (comme la modification des paramètres dans SQL Server ou SqlBulkCopy) pour résoudre ce problème.

J'ai aussi essayé SQL dans SQL Server Management Studio comme

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

Les deux fonctionnent bien. Mais vous ne savez pas pourquoi le serveur SQL refuse la copie en bloc lorsque la valeur IsValid est 0 ou 1. Et lorsque nous affichons les données de la table avec 'select', la valeur pour IsValid est en réalité 0 ou 1.

Réponse acceptée

Je pense que l'erreur est provoquée en essayant de pousser une chaîne (valeur de cellule dans le DataTable) dans une colonne de bit, car l'insertion en bloc n'est pas capable d'effectuer des conversions implicites (les valeurs "0" et "1" en valeurs de bit 1/1) .

Une solution consiste à définir manuellement les colonnes avec leur type actuel:

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

et la construction des cellules à quelque chose comme ça:

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

Réponse populaire

C'est parce que les valeurs booléennes sont remplacées par des valeurs de bits lors de l'insertion. Pour simplifier la vie, il suffit de créer une méthode d'analyse pour convertir bit en bool, ce qui est assez simple. Devrait alors travailler



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi