2016-11-01 3 views
3

Je reçois cette erreur par intermittence dans mon code. Parfois, cela arrive de temps en temps après le temps. Parfois, cela arrive 1 fois sur 10. Je ne fais rien d'unique ou de spécial dans mon SQL contrairement à l'autre affiche sur StackOverflow qui faisait une commande COPY. Tout ce que je fais est SELECT.Npgsql Exception lors de la lecture du flux, Postgres

Voici la trace de la pile:

Exception while reading from stream 
at Npgsql.ReadBuffer.Ensure(Int32 count, Boolean dontBreakOnTimeouts) 
at Npgsql.NpgsqlConnector.DoReadMessage(DataRowLoadingMode dataRowLoadingMode, Boolean isPrependedMessage) 
at Npgsql.NpgsqlConnector.ReadMessageWithPrepended(DataRowLoadingMode dataRow LoadingMode) 
at Npgsql.NpgsqlConnector.ReadMessage(DataRowLoadingMode dataRowLoadingMode) 
at Npgsql.NpgsqlConnector.ReadExpecting[T]() 
at Npgsql.NpgsqlDataReader.NextResultInternal() 
at Npgsql.NpgsqlDataReader.NextResult() 
at Npgsql.NpgsqlCommand.Execute(CommandBehavior behavior) 
at Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(CommandBehavior behavior) 
at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
at System.Data.Common.DbCommand.ExecuteReader() 
at Npgsql.NpgsqlCommand.ExecuteReader() 
at JBetaFinder.Program.portfolioSimulation(String beginResult, String endResult) in c:\Users\j\Documents\Visual Studio 2013\Projects\JBetaFinder\JBetaFinder\Program.cs:line 571 

Toutes les suggestions sur la façon d'éviter cette erreur? Est-ce un problème avec Npgsql et postgres?

Voici mon instruction SQL qui semble être la plus problématique:

select leg1.trade_date, sum(p.qty) as totalqty, max(gas.net_change)*10000 as avggaschange, 
      sum(((leg1.settlement_price - leg2.settlement_price) - (leg3.settlement_price - leg4.settlement_price))*qty*1000000) as spread_value_weight 
      from quant_portfolio p 
      inner join (select distinct trade_date, hub, product, strip, settlement_price, net_change 
          from public.icecleared_gas where contract = 'H') leg1 
          on p.leg1 = leg1.strip 
      inner join (select distinct trade_date, hub, product, strip, settlement_price, net_change 
          from public.icecleared_gas where contract = 'H') leg2 
          on p.leg2 = leg2.strip and leg1.trade_date = leg2.trade_date     
      inner join (select distinct trade_date, hub, product, strip, settlement_price, net_change 
          from public.icecleared_gas where contract = 'H') leg3 
          on p.leg3 = leg3.strip and leg1.trade_date = leg3.trade_date     
      inner join (select distinct trade_date, hub, product, strip, settlement_price, net_change 
          from public.icecleared_gas where contract = 'H') leg4 
          on p.leg4 = leg4.strip and leg1.trade_date = leg4.trade_date 
      inner join (select distinct trade_date, hub, product, strip, contract, settlement_price, net_change 
          from public.icecleared_gas where contract = 'H') gas 
          on gas.strip = (select min(leg1) from quant_portfolio where commodity = 'NG') and gas.trade_date = leg1.trade_date       
      where p.commodity = 'NG' 
      AND (leg1.trade_date>='xxx' and leg1.trade_date<='yyy') 
      group by leg1.trade_date 
      order by leg1.trade_date 

J'ai essayé réorganisant le SQL pour prendre les sous-CHOISIT et les faire toutes les jointures; n'a pas aidé, même erreur.

Voici le code C# appel Npgsql:

query = new NpgsqlCommand(getFullQuantPortBeta.ToString().Replace("xxx", beginResult.ToString()).Replace("yyy", endResult.ToString()), conn); 
      dr = query.ExecuteReader();//code does not get past this line! 
      beta = 0; 
      while (dr.Read()) 
      { 
       baselineData.Add(double.Parse(dr[2].ToString())); 
       responseData.Add(double.Parse(dr[3].ToString())); 
       if (baselineData.Count > 3) 
       { 
        Tuple<double, double> result = MathNet.Numerics.LinearRegression.SimpleRegression.Fit(baselineData.ToArray(), responseData.ToArray()); 
        beta = result.Item2 * BETA_MULT; 
        Console.WriteLine("WEIGHT BETA = " + beta); 
       } 
      } 
      dr.Close(); 
+0

Bienvenue dans Stack Overflow, s'il vous plaît pouvez-vous poster le C# où vous appelez Npgsql? –

+0

Votre rapport d'exception est incomplet: vous ne postez pas le type de l'exception, ni aucune exception interne (probablement le vrai problème). S'il vous plaît ajouter ceux à votre question. –

Répondre

2

conn = new NpgsqlConnection ("serveur = myserver; ID utilisateur = postgres; Mot de passe = somepw; Base de données = somedb; Pooling = false; Délai d'attente = 300; CommandTimeout = 300 ");

J'ai ajouté la propriété CommandTimeout à ma chaîne de connexion et cela semble fonctionner maintenant. Bizarre exception pour une erreur de timeout ...