Auteur de questions
Problème de BULK INSERT utilisé dans un programme

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
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.--Fredfoleide@free.fr
-
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é