我的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函数?
答案 0 :(得分:3)
创建函数时使用双引号和大写字母,因此其名称现在区分大小写。
CREATE OR REPLACE FUNCTION "thisSearchList"
当您在C#代码中调用该函数时,您引用了一个字符串,但该字符串的内容不包含函数名称所需的引号(区分大小写),这就是您收到错误消息的原因显示带小写字母的函数名称
new NpgsqlCommand("thisSearchList", connection);
痛苦的方法是添加第二个引号:
new NpgsqlCommand("\"thisSearchList\"", connection);
从长远来看,简单的方法是通过删除引号来消除函数的区分大小写:
CREATE OR REPLACE FUNCTION thisSearchList
**编辑**
您使用的是命名参数,但名称不匹配。您应该使用@searchstring
代替@string
,或者根本不使用任何名称来使用位置参数匹配。