2015-12-21 43 views
1

我有一個存儲過程。輸入是'id',輸出'n'。 但是,當我嘗試在Visual Studio中運行它時,出現錯誤:輸出參數'n'的值在命令執行結果中不存在。PgSqlParameter錯誤在Visual Studio中使用dotConnect Postgresql

這裏是我的代碼:

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; 

存儲過程:

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; 

回答

0

我從來沒有使用dotConnect爲PG(我是,但是,它的一個巨大的風扇對於Oracle),所以我無法驗證我的語法是否正確。

這就是說,我認爲我看到了你的核心問題。函數和「存儲過程」之間的界限在Postgresql中有些模糊。

你真正想要做的就是在上面的函數上運行一個select。因此,我相信以下將起作用。我知道這將適用於NpgSql,我希望它會正確地轉化爲dotConnect:

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