2016-07-22 1 views
0

J'essaie le Postgres Plus 9.5 avec .Net 4.5, Npgsql 3.1.6 NuGet. J'ai lu ce qu'il y a à propos de cette erreur, mais je ne comprends pas pourquoi je l'ai. Tout est disposé. Voici le code:"Une opération est déjà en cours" sur DataAdaper.Fill

public override DataTable getActListData(int FunkNr) 
{ 
    using (var cmd = new NpgsqlCommand()) 
    { 
    cmd.CommandText = npgsqlCommand3.CommandText; 
    cmd.Connection = this.npgsqlConnection; 
    cmd.Parameters.Add(new Npgsql.NpgsqlParameter("ANWENDUNG", NpgsqlTypes.NpgsqlDbType.Numeric)); 
    cmd.Parameters.Add(new Npgsql.NpgsqlParameter("XFUNKNR", NpgsqlTypes.NpgsqlDbType.Numeric)); 


    using (var da = new NpgsqlDataAdapter(npgsqlCommand3)) 
    { 
     var tab = new DataTable(); 
     da.SelectCommand.Parameters["ANWENDUNG"].Value = getAnwendung(); 
     da.SelectCommand.Parameters["XFUNKNR"].Value = FunkNr; 
     da.Fill(tab); // Here is the error on the 5th call 
     return tab; 
    } 
    } 
} 

Ce problème provient de Npgsql ou provient-il de Postgres?

Quelques autres questions:

J'ai lu ici, que le chargement paresseux est impossible, mais je ne comprenais pas est est à cause de la Npgsql ou de Postgres?

Est-il possible dans Postgres d'ouvrir plusieurs curseurs et de les lire à la demande dans la même connexion?

Edit: Changé le code:

using (var npgsqlConnection = new NpgsqlConnection()) 
    { 
    ConnectionString = string.Format(DataClientFactory.DataBaseConnectString, DB, User, PW); 
    npgsqlConnection.ConnectionString = ConnectionString; 
    npgsqlConnection.Open(); 
    .... 
    the code above here 
    .... 
} 

La même erreur dans le même appel. L'erreur:

System.InvalidOperationException occurred 
    HResult=-2146233079 
    Message=An operation is already in progress. 
    Source=Npgsql 
    StackTrace: 
     bei Npgsql.NpgsqlConnector.StartUserAction(ConnectorState newState) 
    InnerException: 
+0

Votre code semble, OK, mais quelque chose en dehors de votre échantillon peut accéder 'this.npgsqlConnection' ... Vous devez suivre attentivement toutes les utilisations de la connexion. Notez qu'il est de pratique courante d'ouvrir simplement de nouvelles connexions et de les fermer pour chaque opération - le regroupement de connexions garantira l'absence d'impact sur les performances. –

+0

En ce qui concerne les demandes multiples sur la même connexion (je suppose que c'est ce que vous voulez dire par chargement paresseux) ... Npgsql ne vous permet pas d'avoir plusieurs * lecteurs * ouverts en même temps sur la même connexion. Cette fonctionnalité est parfois appelée MARS (plusieurs ensembles de résultats actifs) et est prise en charge par SqlClient. Cependant, vous pouvez toujours utiliser les curseurs PostgreSQL et avoir plusieurs curseurs ouverts, chaque fois que vous récupérez une partie du jeu de résultats. C'est à vous de gérer cela. –

+0

@ShayRojansky La migration est à partir d'Oracle et je dois utiliser la même session (connexion) Il existe des variables de package utilisées entre les appels. – Mottor

Répondre

0

Si le morceau de code affiché fonctionne en même temps sur la même connexion, qui est votre problème - les connexions Npgsql ne sont pas thread-safe, et il est impossible d'avoir plusieurs lecteurs ouverts en même temps (MARS).

+0

Le DevArt n'a pas non plus de MARS (http://forums.devart.com/viewtopic.php?f=3&t=33074&p=114288&hilit=mars#p114288). Avez-vous maintenant si c'est une limitation de Postgres? – Mottor

+0

Il n'y a pas d'accès simultané. Il n'y a qu'un seul fil. Tous les lecteurs sont en train d'utiliser() – Mottor

+0

Essayez de créer et d'ouvrir votre NpgsqlConnection dans votre fonction aussi (au lieu de this.npgsqlConnection), n'oubliez pas de la mettre à disposition aussi bien –