2009-01-16 5 views
3

J'ai une procédure stockée qui effectue l'insertion en bloc sur une base de données SQL Server 2005. Lorsque j'appelle cette procédure stockée à partir de SQL (passant au nom d'un fichier de format local et d'un fichier de données), cela fonctionne correctement. À chaque fois.Insertion en bloc SQL Server échouant lorsqu 'être appelé à partir de .NET SqlCommand

Cependant, lorsque cette même procédure stockée est appelée à partir du code C# .NET 3.5 en utilisant SqlCommand.ExecuteNonQuery, elle fonctionne par intermittence.

Quand il échoue une SqlException est générée indiquant:

ne peut pas charger en vrac. Numéro de colonne non valide dans le fichier de format "c: \ bulkinsert \ MyFile.fmt"

Je ne pense pas que ce message d'erreur soit correct.

Est-ce que quelqu'un a rencontré des problèmes similaires avec l'appel de l'encart en vrac à partir du code?

Merci.

Répondre

1

Comment faites-vous l'insert en vrac? Habituellement, le problème (dans ce scénario) est de savoir si "c: \" est le "c: \" du serveur, ou "c: \" du client.

Cependant. à partir du code C#, l'approche la plus simple consiste à utiliser SqlBulkCopy. Cette classe fournit un accès direct à la fonctionnalité d'insertion en bloc à partir du code managé, y compris les mappages (bien que je ne m'en soucie jamais).

Si le fichier est quelque chose comme csv/tsv/similaire, alors CsvReader est fortement recommandé. Cela fournit l'interface IDataReader que WriteToServer utilise le plus efficacement.

0

Je pense que le problème était de faire avec le fichier de format. Je n'utilise plus le fichier de format et il semble fonctionner à 100% maintenant. Je spécifie plutôt les terminaisons de champ et de ligne dans le SQL.

Declare @Sql Nvarchar(2000); 

SET @Sql = 
'Bulk Insert TestOutputPretest 
From ''c:\rawdata\bulkinsert\Segment1839204.dat'' 
WITH 
     (
     FIELDTERMINATOR ='','', 
     ROWTERMINATOR = ''\n'' 
    )' 

Exec sp_ExecuteSql @Sql; 
0

utilisation

Exec sp_ExecuteSql @Sql; (100% de travail)

exec(@sql) n'est pas très puissant car il a des limites

+1

S'il vous plaît ne pas faire avec votre poste. Ils sont considérés comme du bruit et seront généralement supprimés. – Brandon

Questions connexes