42883: 函数不存在 - 在Entity Framework C# Npgsql中调用Postgres函数

3

我在我的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可能会存在字符串和文本方面的问题!? 它正在寻找一个具有参数字符串而不是文本的函数(在数据库中定义为只能定义文本(而不是字符串))。但是这一行是否应该

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

如果在函数中传递参数时使用了适当的函数(带有文本参数),是否可以解决问题?这时我错过了什么,或者不可能以这种方式调用Postgres函数?


使用相同的用户“western”,您能够在PL/SQL控制台/ pgadmin中成功调用存储过程吗?(即western是否具有对该函数的执行权限) - JGH
是的,我可以。"western" 是一个拥有所有权限的超级用户。 - LavsTo
1个回答

3

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

CREATE OR REPLACE FUNCTION "thisSearchList"

当你在C#代码中调用函数时,引用了一个字符串,但是这个字符串的内容没有包含函数名所需的引号(函数名区分大小写),这就是为什么你得到的错误消息显示函数名为小写字母的原因。
new NpgsqlCommand("thisSearchList", connection);

如果不想出现问题,最好的方法是添加第二个引号:

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

简单的方法是长期来看删除函数的大小写敏感性,方法是去掉引号:
CREATE OR REPLACE FUNCTION thisSearchList

** 编辑 **

您正在使用命名参数,但名称不匹配。您应该使用@searchstring而不是@string,或者不使用任何名称以使用位置参数匹配。


我在函数中去掉了引号,将函数名称改为全小写,但仍然出现相同的错误。 - LavsTo
@JHG 我已经修改了代码以使用searchstring。没有出现任何错误,我可以进入搜索结果页面,但是它是空的,没有显示应该包含记录的字符串中的记录。在这种情况下,返回类型和view/cshtml代码可能是错误的吗? - LavsTo
这是一个不同的问题...虽然您遗漏了与like相关联的%。类似于这里 - JGH
谢谢一如既往的帮助,@JGH,我会查看那个链接。干杯。 - LavsTo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接