2015-07-06 20 views
7

Ho il problema che ho una funzione in postgresql che calcola due interi e dovrebbe restituire il risultato al C# (npgsql) conosle e non so dove sia il mio errore, perché il debugger non dice tutto per me che è utile.Come restituire il risultato di una funzione postgresql in C#? Uscita console vuota

quindi prima di tutto il codice di C# e della funzione.

   ... 
      cmd.Parameters["x"].Value = 20; 
      cmd.Parameters["y"].Value = 22; 
      connection.Open(); 

      if (connection.State == System.Data.ConnectionState.Open) { 
       //Console.WriteLine(cmd.Parameters["x"].Value); 
       command.ExecuteNonQuery(); 
       Console.WriteLine(cmd.Parameters["sum"].Value); 

      } 

e ora il codice del DB:

CREATE OR REPLACE FUNCTION t2(
    IN x integer, 
    IN y integer, 
    OUT sum integer) 
    RETURNS integer AS 
$BODY$BEGIN 
    sum := x + y; 
    INSERT INTO t2 (x, y, sum) values (x, y, sum); 
END 

Così, quando provo a farlo funzionare,

Console.WriteLine(cmd.Parameters["sum"].Value); 

saranno vuote e il [ "somma"] valore. NULLO. Che cosa sto facendo di sbagliato? Ho ragione, quando dico che "somma" è una variabile OUT, non ho bisogno di un ritorno?

Per favore aiuto.

RISOLTO, grazie a tutti! @Patrick mi ha dato la risposta giusta: uso ExecuteScalar() al posto di ExecuteNonQuery()

+1

sono effettivamente l'esecuzione del comando? Non riesco a vederlo nel tuo codice ... – mlinth

+0

con comando intendi la funzione? sì, ma penso che non sia questo il problema? 'DbCommand command = connection.CreateCommand(); command.CommandText = "t2"; command.CommandType = CommandType.StoredProcedure; ' –

+0

modificato il codice completo ora;) –

risposta

5

Invece di

command.ExecuteNonQuery(); 

si dovrebbe chiamare

Object res = command.ExecuteScalar(); 
Console.WriteLine(res); 
+0

Ciao Patrick, non funziona per me. 'Console.WriteLine (command.Parameters [" sum "]. Value);' rimane vuoto. –

+1

'ExecuteScalar()' restituisce il risultato della chiamata di funzione. Non dovresti guardare il parametro qui, ma al risultato della chiamata. – Patrick

+0

Non ne sono completamente sicuro, ma Npgsql potrebbe non supportare l'uso dei parametri PG 'OUT'. In PG, un parametro 'OUT' dichiarato è solo una variazione notazionale della clausola' RETURNS'. – Patrick

1

Hai provato a eseguire questo codice, ad esempio, command.ExecuteNonQuery()? Perché stai leggendo un valore senza effettivamente eseguire la query.

connection.Open(); 
command.ExecuteNonQuery(); 
int result = (int) cmd.Parameters["sum"].Value; 
Console.WriteLine(result); 
+0

Ciao Alex, scusa ho appena preso il codice sbagliato, perché ho provato, provato e disabilitato ExecuteNonQuery(); C'è l'ho. Quando ho provato il tuo codice, ottengo una NullReferenceException con 'int result = (int) command.Parameters [" sum "]. Valore;' –

+0

Grazie Alex. Patrick lo ha risolto, era ExecuteScalar invece di ExecuteNonQuery. Comunque, grazie. ;) –

+0

Ci ho pensato, ma ho rimosso il codice ExecuteScallar perché non funziona sempre con i parametri di output :) È positivo che il tuo fornitore di dati supporti questa funzione. Ma non contateci molto. –