none
Problème de BULK INSERT utilisé dans un programme RRS feed

  • Question

  • Bonjour,

    Je ne sais pas si je suis dans le bon forum.En cas d'erreur de ma part, serait-il possible qu'un modérateur déplace ce fil dans un forum plus adapté ? ( merci d'avance )

    Mon problème est dans le chargement de la table ProductModel ( base de type AdventureWorks LT 2008 SR4 de CodePlex ) à partir du fichier ProductModel.csv installé dans SQL Server\Tools\Samples

    SQL Server Express 2008 RTM ( même problème avec SQL Server Dev 2008 SP1 )

    VC# Express 2010 ( .Net Framework 4.0 avec toutes les mises à jour faites )

    Définition de la table ProductModel ( script récupéré lors de la création à partir de ce programme ) :

    USE [LT2]
    CREATE TABLE [SalesLT].[ProductModel](
    	[ProductModelID] [int] IDENTITY NOT NULL,
    	[Name] [Name] NOT NULL,
    	[CatalogDescription] [xml]([SalesLT].[ProductDescriptionSchemaCollection]) NULL,
    	[rowguid] [uniqueidentifier] NOT NULL CONSTRAINT [DF_ProductModel_rowguid] DEFAULT (NEWID()),
    	[ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_ProductModel_ModifiedDate] DEFAULT (GETDATE())
    ) ON [PRIMARY]
    

    Code utilisé pour le chargement de la table :

              CommonCls.ErrorPlace = "LoadTable SalesLT.ProductModel";
              p_filename = Path.Combine(Environment.CurrentDirectory , "ProductModel.csv");
              p_s = "BULK INSERT [" + _dbname + "].[SalesLT].[ProductModel] FROM N'" + p_filename + "'" + Nl;
              p_s += "WITH (" + Nl;
              p_s += "  CODEPAGE='ACP', " + Nl;
              p_s += "  DATAFILETYPE = 'widechar', " + Nl;
              p_s += "  FIELDTERMINATOR= '~~\t', " + Nl;
              //p_s += "  FIELDTERMINATOR = '\t\0', " + Nl;
              p_s += "  ROWTERMINATOR = '~~\n' , " + Nl;
              //p_s += "  ROWTERMINATOR = '\r\0\n\0' , " + Nl;
              p_s += "  KEEPIDENTITY, " + Nl;
              p_s += "  TABLOCK " + Nl;  
              p_s += ")";
              p_sqlcmd = new SqlCommand(p_s,_sqlconn);
              /*_srvconn.ExecuteScalar(p_s);*/
              /*p_sqlcmd = new SqlCommand(p_s , _sqlconn);*/
              p_nb = p_sqlcmd.ExecuteNonQuery();
              CommonCls.AppWriteLog(true , p_nb.ToString() + " rows loaded in [SalesLT].[ProductModel]");
    

    Fichier de chargement (.csv) visualisé par SSMS ( ouvrir fichier ).Le même Bulk Insert que dans le programme marche dans SSMS ( je ne donne que les 2 premiers enregistrements )

    1~~	Classic Vest~~	~~	29321D47-1E4C-4AAC-887C-19634328C25E~~	2003-06-01 00:00:00.000~~
    2~~	Cycling Cap~~	~~	474FB654-3C96-4CB9-82DF-2152EEFFBDB0~~	2001-06-01 00:00:00.000~~
    

    Erreur renvoyé par le programme

    2/22/2011 11:00:49 PM
    ********** SqlException in LoadTable SalesLT.SalesOrderHeader **********
    Message     : Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 1, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 2, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 3, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 4, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 5, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 6, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 7, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 8, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 9, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 10, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 11, colonne 21 (ModifiedDate).
    Chargement en masse impossible en raison du dépassement du nombre maximal d'erreurs (10).
    Le fournisseur OLE DB "BULK" du serveur lié "(null)" a rapporté une erreur. Le fournisseur n'a donné aucune information quant à cette erreur.
    Impossible d'extraire une ligne du fournisseur OLE DB "BULK" du serveur lié "(null)".
    BaseException  : 
    System.Data.SqlClient.SqlException (0x80131904): Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 1, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 2, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 3, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 4, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 5, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 6, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 7, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 8, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 9, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 10, colonne 21 (ModifiedDate).
    Erreur de conversion des données à charger en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 11, colonne 21 (ModifiedDate).
    Chargement en masse impossible en raison du dépassement du nombre maximal d'erreurs (10).
    Le fournisseur OLE DB "BULK" du serveur lié "(null)" a rapporté une erreur. Le fournisseur n'a donné aucune information quant à cette erreur.
    Impossible d'extraire une ligne du fournisseur OLE DB "BULK" du serveur lié "(null)".
      at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
      at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
      at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
      at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
      at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
      at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
      at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
      at Create_Database_Like_AdventureWorksLT2008SR4.SmoCls.LoadTables() in E:\Projets VCSharp 2010\Create_Database_Like_AdventureWorksLT2008SR4\Create_Database_Like_AdventureWorksLT2008SR4\CreateDatabase.cs:line 856
    Class      : 16
    ErrorCode    : -2146232060
    HelpLink    : 
    LineNumber   : 1
    Number     : 4864
    Procedure    : 
    Server     : LAMBIN-1D6EECAC\SQLEXPRESS1
    Source     : .Net SqlClient Data Provider
    State      : 1
    TargetSite   : OnError
    Data      : 
     Key : HelpLink.ProdName Value : Microsoft SQL Server
     Key : HelpLink.ProdVer Value : 10.00.1600
     Key : HelpLink.EvtSrc Value : MSSQLServer
     Key : HelpLink.EvtID Value : 4864
     Key : HelpLink.BaseHelpUrl Value : http://go.microsoft.com/fwlink
     Key : HelpLink.LinkId Value : 20476
    InnerException : N/A
    StackTrace   : 
      at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
      at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
      at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
      at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
      at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
      at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
      at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
      at Create_Database_Like_AdventureWorksLT2008SR4.SmoCls.LoadTables() in E:\Projets VCSharp 2010\Create_Database_Like_AdventureWorksLT2008SR4\Create_Database_Like_AdventureWorksLT2008SR4\CreateDatabase.cs:line 856
    ********** End of SqlException in LoadTable SalesLT.SalesOrderHeader **********
    
    

    Après avoir fait de multiples essais, je me suis décidé à poster dans ce forum en espérant que quelqu'un voudra bien se pencher sur cette erreur, m'expliquer quelle est l'erreur que j'ai fait et comment la corriger.Merci d'avance.

    Ne pas hésiter à me demander d'autres extraits de code.

    Bonne journée


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.

    • Modifié Papy Normand mardi 22 février 2011 22:47 Modification de présentation
    mardi 22 février 2011 22:12

Toutes les réponses

  • > ********** SqlException in LoadTable SalesLT.SalesOrderHeader **********
    > Message     : Erreur de conversion des données à charger en masse
    > (incompatibilité de type ou caractère non valide pour la page de codes
    > spécifiée) pour la ligne 1, colonne 21 (ModifiedDate).
     
    Les logins utilisés sous SSMS et par le programme sont les mêmes ?
    Si non, voyez déjà s'ils ont le même langage par défaut.
    Pas d'autre idée.
     --
    Fred
    foleide@free.fr
     
    mercredi 23 février 2011 06:02
  • Bonjour Foleide,

    Merci pour votre réponse rapide.

    J'utilise pour SSMS et mon application l'authentification Windows ( la plus facile à utiliser et je suis sûr de me retrouver dans les mêmes conditions ).

    Je pense plutôt à un problème dû à la présence de widechar. J'essaie de creuser de ce côté.

    A noter que je n'ai aucun problème avec d'autres tables comme [SalesLT].[ProductDescription] qui est chargée juste avant ProductModel mais le BULK INSERT est légèrement différent:

         CommonCls.ErrorPlace = "LoadTable SalesLT.ProductDescription";
         p_filename = Path.Combine(Environment.CurrentDirectory , "ProductDescription.csv");
         p_s = "BULK INSERT [" + _dbname + "].[SalesLT].[ProductDescription] FROM N'" + p_filename + "' " + Nl;
         p_s += "WITH ( " + Nl;
         p_s += " CODEPAGE = 'ACP'," + Nl;
         p_s += " DATAFILETYPE = 'char', " + Nl;
         p_s += " FIELDTERMINATOR= '\t', " + Nl;
         p_s += " ROWTERMINATOR = '\n' , " + Nl;
         p_s += " KEEPIDENTITY, " + Nl;
         p_s += " TABLOCK " + Nl;
         p_s += " )";
         p_sqlcmd = new SqlCommand(p_s , _sqlconn);
         p_nb = p_sqlcmd.ExecuteNonQuery();
         CommonCls.AppWriteLog(true , p_nb.ToString() + " rows loaded in [SalesLT].[ProductDescription]");
    
    

    Est-ce un problème de FIELDTERMINATOR ? Possible car c'est la 1ère fois que j'utilise des données sur 4 octets au lieu de 2 (char).Encore une piste à explorer...

    Peut-être que ma requête est mal formattée.Je vais modifier mon programme pour que je puisse afficher cette requête avant son exécution.

    Bonne journée.

    PS : Je vais essayer de charger une DataTable avec le fichier .csv et de charger cette DataTable dans ma Table ProductModel, mais là encore , je vais me heurter au problème des caractères à 4 octets

    PS2 : OS : XP Pro SP3  Français  VC# Express 2010 Français SQL Server Express et DEV : Français Base de données : collation classique pour le Français ==> langage par défaut Français 

     


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    • Modifié Papy Normand mercredi 23 février 2011 08:15 PS2 ajouté
    mercredi 23 février 2011 08:10