postgresql 执行带有参数的存储过程

Kor*_*zay 5 c# postgresql stored-functions npgsql

我的 Npgsql 版本 3.2.5 - Postgresql 9.6

我收到此错误CommandType.StoredProcedure(但CommandType.Text有效):

Npgsql.PostgresException:'42883:函数 customer_select(pEmail => 文本,密码 => 文本) 不存在'

string sql3 = @"customer_select";

NpgsqlConnection pgcon = new NpgsqlConnection(pgconnectionstring);
pgcon.Open();
NpgsqlCommand pgcom = new NpgsqlCommand(sql3, pgcon);
pgcom.CommandType = CommandType.StoredProcedure;
pgcom.Parameters.AddWithValue(":pEmail", "myemail@hotmail.com");
pgcom.Parameters.AddWithValue(":pPassword", "eikaylie78");
NpgsqlDataReader pgreader = pgcom.ExecuteReader();

while (pgreader.Read()) {
    string name = pgreader.GetString(1);
    string surname = pgreader.GetString(2);
}
Run Code Online (Sandbox Code Playgroud)

这是数据库中的函数:

CREATE OR REPLACE FUNCTION public.customer_select(
    pemail character varying, ppassword character varying)
RETURNS SETOF "CustomerTest"
LANGUAGE 'plpgsql'
COST 100.0
AS $function$                                   
BEGIN 
    RETURN QUERY
        SELECT "CustomerTestId", "FirstName", "LastName", "Email", "Password"
        FROM public."CustomerTest"
        WHERE "Email" = pEmail AND "Password" = pPassword;
END; 
$function$;
ALTER FUNCTION public.customer_select(character varying, character varying)
OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

Sha*_*sky 3

Npgsql 确实支持命名参数,但您的参数大小写与您的函数不匹配,请尝试pemail代替pEmail和。ppasswordpPassword

CommandType.StoredProcedure请注意,与 Npgsql 一起使用over 并没有什么特别的优势CommandType.Text- 两者最终都会做同样的事情。CommandType.StoredProcedure主要是为了方便从SqlServer等移植代码。