C# 如何使用postgres中的存储过程函数在数据库中插入数据列表

C# 如何使用postgres中的存储过程函数在数据库中插入数据列表,c#,sql,postgresql,C#,Sql,Postgresql,我已经给出了需要插入的应用程序列表,但在声明如下并使用42883执行显示之后:函数spinsertapplicationexternalinfrausers(_app_name_externalinfra=>character variabling[],_user_email=>character variabling,_role_name=>character variabling,isaad_user=>boolean,isaed_user=>boolean)不存在错误 Dal.Inser

我已经给出了需要插入的应用程序列表,但在声明如下并使用42883执行显示之后:函数spinsertapplicationexternalinfrausers(_app_name_externalinfra=>character variabling[],_user_email=>character variabling,_role_name=>character variabling,isaad_user=>boolean,isaed_user=>boolean)不存在错误

 Dal.InsertApplicationExternalUser(listapplications.ToArray(), appuser);                           
  ShowMessage("Data inserted successfully", MessageType.Success);

-----------------


In DataAccesslayer :  public void InsertApplicationExternalUser(string[] appnames,ApplicationUsers appuser)
        {
            con = new NpgsqlConnection(cs);
            con.Open();
            using (NpgsqlTransaction tran = con.BeginTransaction())
            {
               cmd = new NpgsqlCommand("spinsertapplicationexternalinfrausers", con);                
                cmd.CommandType = CommandType.StoredProcedure;



               cmd.Parameters.AddWithValue("_app_name_externalinfra", NpgsqlDbType.Array | NpgsqlDbType.Varchar, appnames);              
                cmd.Parameters.AddWithValue("_user_email", NpgsqlDbType.Varchar, appuser.User_email);
                cmd.Parameters.AddWithValue("_role_name", NpgsqlDbType.Varchar, appuser.Role_Name);
                cmd.Parameters.AddWithValue("isaad_user", NpgsqlDbType.Boolean, appuser.isAAD_User);
                cmd.Parameters.AddWithValue("isaed_user", NpgsqlDbType.Boolean, appuser.isAED_user);
                cmd.ExecuteNonQuery();
                tran.Commit();

---------------------------------------
Function created is as like:

CREATE OR REPLACE FUNCTION public.spinsertapplicationexternalinfrausers(
    _app_name_externalinfra character varying,
    _user_email character varying,
    _role_name character varying,
    isaad_user boolean,
    isaed_user boolean)
    RETURNS void
    LANGUAGE 'plpgsql'......
结果为:42883:函数spinsertapplicationexternalinfrausers(\u app\u name\u externalinfra=>字符变化[],\u user\u email=>字符变化,\u role\u name=>字符变化,iSad\u user=>布尔,isaed\u user=>布尔)不存在


请在这方面提供帮助

要在PostgreSQL和C#中调用函数或存储过程,您不会像使用大多数ADO.net适配器那样使用
CommandType.StoredProcedure
;您只需使用
call
select
在SQLIDE中调用它。由于您的示例是一个函数,它应该如下所示:

cmd = new NpgsqlCommand("select spinsertapplicationexternalinfrausers(:app, :user, :role, :isaad, :isaed", con);
cmd.Parameters.AddWithValue("app", NpgsqlDbType.Array | NpgsqlDbType.Varchar, appnames);              
cmd.Parameters.AddWithValue("user", NpgsqlDbType.Varchar, appuser.User_email);
cmd.Parameters.AddWithValue("role", NpgsqlDbType.Varchar, appuser.Role_Name);
cmd.Parameters.AddWithValue("isaad", NpgsqlDbType.Boolean, appuser.isAAD_User);
cmd.Parameters.AddWithValue("isaed", NpgsqlDbType.Boolean, appuser.isAED_user);
cmd.ExecuteNonQuery();
您没有询问,但如果函数返回的不是void,则可以使用
ExecuteScalar
返回带有查询结果的对象


如果查询返回数据集,则可以使用普通的数据读取器返回结果。

要调用PostgreSQL和C#中的函数或存储过程,您不会像使用大多数ADO.net适配器那样使用
CommandType.StoredProcedure
;您只需使用
call
select
在SQLIDE中调用它。由于您的示例是一个函数,它应该如下所示:

cmd = new NpgsqlCommand("select spinsertapplicationexternalinfrausers(:app, :user, :role, :isaad, :isaed", con);
cmd.Parameters.AddWithValue("app", NpgsqlDbType.Array | NpgsqlDbType.Varchar, appnames);              
cmd.Parameters.AddWithValue("user", NpgsqlDbType.Varchar, appuser.User_email);
cmd.Parameters.AddWithValue("role", NpgsqlDbType.Varchar, appuser.Role_Name);
cmd.Parameters.AddWithValue("isaad", NpgsqlDbType.Boolean, appuser.isAAD_User);
cmd.Parameters.AddWithValue("isaed", NpgsqlDbType.Boolean, appuser.isAED_user);
cmd.ExecuteNonQuery();
您没有询问,但如果函数返回的不是void,则可以使用
ExecuteScalar
返回带有查询结果的对象

如果查询返回数据集,则可以使用普通数据读取器返回结果