2015-12-21 1 views
1

J'ai une procédure stockée. L'entrée est 'id', sortie 'n'. Mais lorsque j'essaie de l'exécuter dans Visual Studio, j'ai une erreur: La valeur du paramètre de sortie 'n' est absente dans le résultat de l'exécution de la commande.Erreur PgSqlParameter utilisant dotConnect Postgresql dans Visual Studio

Voici mon code:

int id = Convert.ToInt32(this.textBox1.Text); 
PgSqlConnection con = new PgSqlConnection(); 
con.ConnectionString = Properties.Settings.Default.DBConnectionString; 
PgSqlCommand cmd = con.CreateCommand(); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "getcountmaterials"; 
PgSqlParameter param = new PgSqlParameter("n", SqlDbType.Int); 
param.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(param); 
cmd.Parameters.Add(new PgSqlParameter("@id", id)); 
con.Open(); 
cmd.ExecuteNonQuery(); 
string kolvo = cmd.Parameters["n"].Value.ToString(); 
con.Close(); 
this.result.Text = kolvo; 

procédure stockée:

CREATE OR REPLACE FUNCTION public.getcountmaterials(id integer) 
    RETURNS integer AS 
$BODY$ 
declare n integer; 
begin n := (select sum(count) from materials_in_warehouses 
where id_materials = id); 
return n; 
end; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION public.getcountmaterials(integer) 
    OWNER TO postgres; 

Répondre

0

Je ne l'ai jamais utilisé dotConnect pour Pg (Je suis, cependant, un grand fan de celui-ci pour Oracle), donc je ne peux pas vérifier que j'ai la syntaxe correcte sur tout cela.

Cela dit, je pense que je vois votre problème de base. Les lignes entre les fonctions et les "procédures stockées" sont quelque peu floues avec Postgresql.

Tout ce que vous voulez vraiment faire est d'exécuter un select sur la fonction ci-dessus. En tant que tel, je crois que ce qui suit fonctionnera. Je sais que cela fonctionnerait avec NpgSql, et j'espère qu'il traduira correctement en dotConnect:

PgSqlCommand cmd = new PgSqlCommand("select getcountmaterials(:ID)", con); 
cmd.Parameters.AddWithValue("ID", id); 
string kolvo = cmd.ExecuteScalar().ToString();