Insertion de GUID avec SqlBulkCopy

c# sqlbulkcopy sql-server sql-server-2008

Question

Je suis en train de faire un insert en vrac avec la SqlBulkCopy classe de flatfiles créées par SQL Server Management Import Export Assistant. Les fichiers sont séparés par des virgules.

Une ligne dans le fichier peut ressembler à ceci:

{DCAD82A9-32EC-4351-BEDC-2F8291B40AB3}, {ca91e768-072d-4e30-aaf1-bfe32c24008f], 900001: 1792756.900001: 1792757, Basladdning, 2011-04-29 02: 54: 15: 3000: 1 04-29 02: 54: 15.380000000, {20A3C50E-8029-41DE-86F1-DDCDB9A78BA5}

L'erreur que je reçois est:

System.InvalidOperationException non gérée
Message = La valeur donnée de type String de la source de données ne peut pas être convertie en type uniqueidentifier de la colonne cible spécifiée.

Le problème est donc la conversion de chaîne en GUID.

J'ai essayé ce qui suit:

  • Essayé différents encodages, UTF8 et ANSI
  • Suppression du {} entourant les GUID
  • Ajouté '' autour des GUIDS, avec et sans {}

Aucune suggestion? Dans le fichier plat où est le '', se trouve une colonne qui a aussi Guid comme type de données. La colonne est NULL où l'assistant l'a exportée sous la forme ''. Cela peut-il être le problème?

Le code:

using (var file = new StreamReader(filePath))
using (var csv = new CsvReader(file, false)) 
using (var bcp = new SqlBulkCopy(CreateConnectionString()))
{
    bcp.DestinationTableName = "table";
    bcp.WriteToServer(csv);
}

Définition du tableau:

CREATE TABLE [beata].[T_FeatureInstance]( 
    [FeatureInstanceId] [uniqueidentifier] NOT NULL, 
    [FeatureInstanceParentId] [uniqueidentifier] NULL, 
    [FeatureTypeAliasId] [uniqueidentifier] NOT NULL, 
    [Uuid] [varchar](1000) NOT NULL, 
    [VersionId] [varchar](50) NOT NULL, 
    [SkapadAv] [varchar](255) NULL, 
    [Skapad] [datetime] NOT NULL, 
    [UppdateradAv] [varchar](255) NOT NULL, 
    [Uppdaterad] [datetime] NOT NULL, 
    [Gs] [uniqueidentifier] NOT NULL,

Réponse acceptée

Le problème est que la colonne vide de {DCAD82A9-32EC-4351-BEDC-2F8291B40AB3},,{ca91e768-072d-4e30-aaf1-bfe32c24008f} est interprétée comme '' au lieu de NULL . Je viens juste d’essayer un INSERT STATEMENT sur ma base de données locale, et cette erreur a disparu lorsque j’ai spécifié NULL au lieu de '' Il existe une autre erreur que vous pourriez obtenir:

Conversion failed when converting date and/or time from character string.

La raison en est que SQL n'autorise la précision décimale à 3 chiffres que pendant des millisecondes. Vous devez donc arrondir '2011-04-29 02:54:15.380000000' à '2011-04-29 02:54:15.380' , et tout ira bien.

Une façon de le faire serait comme mentionné ici . Vous pouvez également modifier le code CsvReader pour renvoyer DBNULL lorsque la valeur est string.Empty dans la fonction CsvReader.GetValue (int). Regardez ici


Réponse populaire

Dans votre DataTable.Columns.Add incluez le type de données en tant que second paramètre. Cela devrait faire l'affaire. Exemple:

DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(Guid));


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