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

时间:2017-06-28 09:34:37

标签: c# postgresql function

我的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);

在使用函数传递参数时会解决问题,因此在调用时它会获得相应的函数(带有text参数)?我现在缺少什么,或者不能以这种方式调用postgres函数?

1 个答案:

答案 0 :(得分:3)

创建函数时使用双引号和大写字母,因此其名称现在区分大小写。

CREATE OR REPLACE FUNCTION "thisSearchList"

当您在C#代码中调用该函数时,您引用了一个字符串,但该字符串的内容不包含函数名称所需的引号(区分大小写),这就是您收到错误消息的原因显示带小写字母的函数名称

new NpgsqlCommand("thisSearchList", connection);

痛苦的方法是添加第二个引号:

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

从长远来看,简单的方法是通过删除引号来消除函数的区分大小写:

CREATE OR REPLACE FUNCTION thisSearchList

**编辑**

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