C# 如何从c调用plpgsql函数#

C# 如何从c调用plpgsql函数#,c#,postgresql,plpgsql,C#,Postgresql,Plpgsql,我在plpgsql中创建了一个函数,并试图从.net核心api调用存储过程 但我在c中遇到了以下异常# 42883:函数过程插入测试(brndcode=>integer,brndname=>character variabling,brndsname=>character variabling,prdtype=>character,contracte=>character,crddate=>date,status=>integer,recstat=>integer,brndgrpseqno=>i

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

42883:函数过程插入测试(brndcode=>integer,brndname=>character variabling,brndsname=>character variabling,prdtype=>character,contracte=>character,crddate=>date,status=>integer,recstat=>integer,brndgrpseqno=>integer,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$
;
从c#调用过程:


有什么问题吗?

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

无返回值:

有返回值


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

无返回值:

有返回值

对我来说,它正在发挥作用

PGDbContext _context = new PGDbContext();
            string d1 = "mm5";
            string d2 = "mmTest6";
            int d3 = 11;
            string d4 = "1";
            var DistributionChannelGUID = _context.Database.SqlQuery<List<string>>("call dbo.insupdelglclassmaster({0},{1},{2},{3})", d1, d2, d3, d4).ToList();
PGDbContext _context=new PGDbContext();
字符串d1=“mm5”;
字符串d2=“mmTest6”;
int d3=11;
字符串d4=“1”;
var DistributionChannelGUID=_context.Database.SqlQuery(“调用dbo.insupdelglclassmaster({0}、{1}、{2}、{3})”,d1、d2、d3、d4);
对我来说,它正在工作

PGDbContext _context = new PGDbContext();
            string d1 = "mm5";
            string d2 = "mmTest6";
            int d3 = 11;
            string d4 = "1";
            var DistributionChannelGUID = _context.Database.SqlQuery<List<string>>("call dbo.insupdelglclassmaster({0},{1},{2},{3})", d1, d2, d3, d4).ToList();
PGDbContext _context=new PGDbContext();
字符串d1=“mm5”;
字符串d2=“mmTest6”;
int d3=11;
字符串d4=“1”;
var DistributionChannelGUID=_context.Database.SqlQuery(“调用dbo.insupdelglclassmaster({0}、{1}、{2}、{3})”,d1、d2、d3、d4);

谢谢,这很有效,但我需要像这样调用plpgsql过程??如何返回值/输出参数?感谢您的努力,我需要在过程的参数中添加输出参数吗?如何提及输出参数?我不能使用Parameters.AddWithValue或Dapper从c#调用过程?不需要提及参数名称,但参数顺序很重要。应该避免通过联系参数来生成SQL。它使系统暴露于SQL注入。谢谢,这是可行的,但我需要像这样调用plpgsql过程??我如何才能返回值/输出参数?谢谢你的努力,我需要在过程的参数中添加输出参数吗?如何提及输出参数?我不能使用Parameters.AddWithValue或Dapper从c#调用过程?不需要提及参数名称,但参数顺序很重要。应该避免通过联系参数来生成SQL。它使系统暴露于SQL注入。请尝试在.net中重命名参数以与SQL脚本中的名称相匹配,
@brndcode
=>
@p\u brndcode
@brndname
@p\u brndname
等等。@ArjunVachhani OMG,非常感谢,我完全忘记了XD,现在它工作正常了。在.net中重命名参数以与sql脚本中的名称匹配,
@brndcode
=>
@p\u brndcode
@brndname
@p\u brndname
等等。@ArjunVachhani天哪,非常感谢你,我完全忘记了XD现在它工作正常了
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);
    }
}
PGDbContext _context = new PGDbContext();
            string d1 = "mm5";
            string d2 = "mmTest6";
            int d3 = 11;
            string d4 = "1";
            var DistributionChannelGUID = _context.Database.SqlQuery<List<string>>("call dbo.insupdelglclassmaster({0},{1},{2},{3})", d1, d2, d3, d4).ToList();