如何从 C# 调用 plpgsql 函数

Shr*_*kar 0 c# postgresql plpgsql

我在 plpgsql 中创建了一个函数,我试图从 .net core api 调用存储过程,但我在 c# 中遇到以下异常

42883:函数 proc_insert_test(brndcode => 整数,brndname => 字符变化,brndsname => 字符变化,prdtype => 字符,中断 => 字符,crddate => 日期,状态 => 整数,recstat => 整数,brndgrpseqno =>整数,wefrom => date) 不存在

没有函数与给定名称和参数类型匹配。您可能需要添加显式类型转换。

程序:

CREATE OR REPLACE FUNCTION public.proc_insert_test(p_brndcode integer, 
                                                p_brndname varchar(100), 
                                                p_brndsname varchar(100), 
                                                p_prdtype char(1),
                                                p_discontinue char(1),
                                                p_crddate date,
                                                p_status integer,
                                                p_recstat integer,
                                                p_brndgrpseqno integer,
                                                p_wefrom date)
RETURNS char
LANGUAGE plpgsql
AS $body$
BEGIN
    Insert into arc_mmstbrndgroup(brndcode, brndname, brndsname, prdtype, discontinue, crddate, status, recstat, brndgrpseqno, wefrom) 
    values(p_brndcode, p_brndname, p_brndsname, p_prdtype, p_discontinue, p_crddate, p_status, p_recstat, p_brndgrpseqno, p_wefrom);
    return 'saved';
END;
$body$
;
Run Code Online (Sandbox Code Playgroud)

从 C# 调用的过程:

NpgsqlCommand cmd = new NpgsqlCommand("proc_insert_test", _connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@brndcode", NpgsqlTypes.NpgsqlDbType.Integer, 123);
cmd.Parameters.AddWithValue("@brndname", NpgsqlTypes.NpgsqlDbType.Varchar, 100, "Test3");
cmd.Parameters.AddWithValue("@brndsname", NpgsqlTypes.NpgsqlDbType.Varchar, 100, "Test3");
cmd.Parameters.AddWithValue("@prdtype", NpgsqlTypes.NpgsqlDbType.Char, 1, "T");
cmd.Parameters.AddWithValue("@discontinue", NpgsqlTypes.NpgsqlDbType.Char, 1, "T");
cmd.Parameters.AddWithValue("@crddate", NpgsqlTypes.NpgsqlDbType.Date, DateTime.Now);
cmd.Parameters.AddWithValue("@status", NpgsqlTypes.NpgsqlDbType.Integer, 1);
cmd.Parameters.AddWithValue("@recstat", NpgsqlTypes.NpgsqlDbType.Integer, 9);
cmd.Parameters.AddWithValue("@brndgrpseqno", NpgsqlTypes.NpgsqlDbType.Integer, 1234);
cmd.Parameters.AddWithValue("@wefrom", NpgsqlTypes.NpgsqlDbType.Date, DateTime.Now);
_connection.Open();
cmd.ExecuteNonQuery();
cmd.Dispose();
_connection.Close();
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?

har*_*rju 5

我也面临这个问题。经过一些分析发现日期数据类型转换不起作用。所以我们改变了我们的调用方式,

无返回值:

string strquery = "SELECT PROC_INSERT_TEST(123,'Test3','Test3','T','T',";
strquery = strquery + "'" + DateTime.Now.ToString("MMM-dd-yyyy HH:mm:ss") + "',1,9,1234,";
strquery = strquery + "'" + DateTime.Now.ToString("MMM-dd-yyyy HH:mm:ss") + "')";

NpgsqlCommand cmd = new NpgsqlCommand(strquery, _connection);
_connection.Open();
cmd.ExecuteNonQuery();
cmd.Dispose();
_connection.Close();
Run Code Online (Sandbox Code Playgroud)

有返回值

string strquery = "BEGIN; SELECT PROC_INSERT_TEST_WITH_RETURN(123,'Test3','Test3','T','T',";
strquery = strquery + "'" + DateTime.Now.ToString("MMM-dd-yyyy HH:mm:ss") + "',1,9,1234,";
strquery = strquery + "'" + DateTime.Now.ToString("MMM-dd-yyyy HH:mm:ss") + "')";

NpgsqlCommand cmd = new NpgsqlCommand(strquery, _connection);
_connection.Open();
object cursorVal = cmd.ExecuteScalar();
DataSet ds = FetchAll(_connection, cursorVal);
cmd.Dispose();
_connection.Close();


private DataSet FetchAll(NpgsqlConnection _connection, object cursorVal)
{
    try
    {
        DataSet actualData = new DataSet();

        string strSql = "fetch all from \"" + cursorVal + "\";";
        NpgsqlCommand cmd = new NpgsqlCommand(strSql, _connection);
        NpgsqlDataAdapter ada = new NpgsqlDataAdapter(cmd);
        ada.Fill(actualData);

        return actualData;

    }
    catch (Exception Exp)
    {
        throw new Exception(Exp.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)