42883:函数不存在 - 在实体框架C#NPGSQL中调用Postgres函数



我在Postgres数据库中具有以下功能

CREATE OR REPLACE FUNCTION "thisSearchList"(IN searchstring text)
 RETURNS TABLE(q_description text, q_barcode text) AS
$BODY$
    SELECT q_description, q_barcode 
    FROM q_product
    WHERE q_description like $1
OR q_barcode like $1    
$BODY$
LANGUAGE sql VOLATILE
COST 100
ROWS 1000;

在我的C#代码中,我有以下代码要使用上述功能

NpgsqlConnection connection = new NpgsqlConnection("Host=192.168.0.52;Database=bolo;Username=western;Password=western");
connection.Open(); /*OPEN DATABASE CONNECTION*/
NpgsqlCommand cmd = new NpgsqlCommand("thisSearchList", connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@string", NpgsqlTypes.NpgsqlDbType.Text);
cmd.Parameters["@string"].Value = searchValue.ToUpper();
NpgsqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
var prod = new ProductViewModel();
prod.q_description = dr["q_description"].ToString();
prod.q_barcode = dr["q_barcode"].ToString();               
model.Add(prod);  
}

运行应用程序 - 搜索文本框中的用户类型,然后单击搜索以触发该功能并返回要在查看/页面上显示的产品列表:我得到以下错误

42883: function thissearchlist(string := text) does not exist

来源
NpgsqlDataReader dr = cmd.ExecuteReader();

从我通过谷歌搜索的理解中,Postgres可能会在字符串和文字上遇到问题!它查找具有参数字符串而不是DB中定义的文本的函数(只能在Postgres中定义文本(不是字符串((。但是那不会这条线

cmd.Parameters.Add("@string", NpgsqlTypes.NpgsqlDbType.Text);

在使用该函数传递参数时会解决问题,因此调用时会获得适当的函数(带有文本参数(?此时我缺少什么,或者不可能以这种方式调用Postgres功能?

创建功能时,您正在使用双引号和大写字母,因此其名称现在是敏感的。

CREATE OR REPLACE FUNCTION "thisSearchList"

在C#代码中调用该函数时,您正在引用一个字符串,但是该字符串的内容不包含函数名称所需的引号(这很敏感(,这就是为什么您获取的错误消息用低案例字母显示功能名称

new NpgsqlCommand("thisSearchList", connection);

痛苦的方法是添加第二报价:

new NpgsqlCommand(""thisSearchList"", connection);

从长远来看,简单的方法是通过删除引号来摆脱您功能的案例敏感性:

CREATE OR REPLACE FUNCTION thisSearchList

**编辑**

您使用的是命名参数,但名称不匹配。您应该使用@searchstring代替@string,或者根本不使用任何名称来使用位置参数匹配。

最新更新