2017-09-20 4 views
3

J'écris le contenu d'un fichier csv à une table PostgreSQL à l'aide de NPGSQL dans la version 3.2.5.Écrit le contenu d'un fichier csv à PostgreSQL avec NPGSQL échoue

Le contenu de mon csv est le suivant

id, value 
1, 89 
2, 286 
3, 80 
4, 107 

J'utilise la commande suivante pour écrire

Using writer = conn.BeginTextImport("COPY tbl_test (id,value) FROM 'C:/temp/test.csv' DELIMITER ',' CSV HEADER") 

Quand je lance mon code, les valeurs sont écrites dans ma base de données, mais la commande lance le message d'erreur suivant:

Received unexpected backend message CompletedResponse. Please file a bug. 

Lorsque j'exécute la commande directement dans le SQL Shell tout fonctionne bien, donc le problème semble être produit par NPGSQL.

Voici ma commande que je l'utilise dans le SQL Shell:

\COPY tbl_test(id,value) FROM 'C:/temp/test.csv' DELIMITER ',' CSV HEADER; 

Quelqu'un at-il une expérience d'autre avec ce message?

+0

Je pense que c'est une bonne idée d'ajouter quelques lignes du fichier csv réel. –

+0

Le délimiteur par défaut est l'onglet au format texte et la virgule dans csv, donc peut-être vous devez spécifier qu'il est point-virgule à la place: 'DELIMITER ';'' –

+0

J'ai déjà essayé cela avec le même résultat mais j'ai modifié ma question. Même j'ai changé le délimiteur de ';' à ',' –

Répondre

0

Comme répondu dans le github issue, vous utilisez l'API de manière incorrecte.

Si vous avez votre fichier CSV côté client (où l'application Npgsql est en cours d'exécution), vous devez utiliser COPY tbl_test(value) FROM STDIN, et non FROM c:\temp\test.csv. Ce dernier est utilisé lorsque le fichier csv est sur le serveur PostgreSQL. See the documentation.

Si vous voulez simplement importer un fichier présent sur votre serveur, exécutez simplement la commande COPY comme un SQL normal - créez une commande et exécutez-la avec ExecuteNonQuery. N'utilisez pas l'API BeginTextImport.

+0

Merci pour le conseil. Sans utiliser la fonction API 'TextImport' cela fonctionne. Je suis seulement un peu confus, car il n'y a pas d'indice dans la documentation de NPGSQL.Dans les documents, vous utilisez 'TextImport', c'est la raison pour laquelle je l'ai utilisé aussi. –

+0

L'exemple de code dans les docs npgsql montre clairement un exemple avec 'FROM STDIN', et avec les données CSV écrites en C#. [Les docs PostgreSQL pour COPY] (https://www.postgresql.org/docs/current/static/sql-copy.html) expliquent la différence entre 'FROM STDIN' et un fichier présent sur le serveur. –