Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Npgsql/Postgresql:;“功能不存在”;发生错误时显示错误消息_C#_Sql_Postgresql_Npgsql - Fatal编程技术网

C# Npgsql/Postgresql:;“功能不存在”;发生错误时显示错误消息

C# Npgsql/Postgresql:;“功能不存在”;发生错误时显示错误消息,c#,sql,postgresql,npgsql,C#,Sql,Postgresql,Npgsql,这让我抓狂。有一个类似的问题可能与和有关,但答案似乎不是很明显。PostgreSQL 9.5 我有一个基于Npgsql的成员资格查询,如下所示: using (var conn = new NpgsqlConnection(ConnectionString)) { conn.Open(); using (var comm = new NpgsqlCommand("get_user_by_username", conn)) { comm.CommandTyp

这让我抓狂。有一个类似的问题可能与和有关,但答案似乎不是很明显。PostgreSQL 9.5

我有一个基于Npgsql的成员资格查询,如下所示:

using (var conn = new NpgsqlConnection(ConnectionString))
{
    conn.Open();
    using (var comm = new NpgsqlCommand("get_user_by_username", conn))
    {
        comm.CommandType = CommandType.StoredProcedure;
        comm.Parameters.Add("_user_name", NpgsqlDbType.Varchar, 250).Value = username;
        comm.Parameters.Add("_application_name", NpgsqlDbType.Varchar, 250).Value = _ApplicationName;
        comm.Parameters.Add("_online", NpgsqlDbType.Boolean).Value = userIsOnline;
        using (var reader = comm.ExecuteReader())
        {
            return GetUsersFromReader(reader).OfType<MembershipUser>().FirstOrDefault();
        }
    }
}
我已经检查了,双重检查了,三次检查了连接字符串。。。它指向这个数据库,并具有正确的登录名。该函数在pgAdmin窗口中执行良好

我的连接字符串类似于:

Server=localhost;Port=5432;Database=mysecuritydb;User Id=(configured db login);Password=(my password);Pooling=true;ConvertInfinityDateTime=true;
…通过这些凭据,我可以看到以下功能:

但是,当我在asp.net项目中将其用作引用库时,我收到以下消息:

Server Error in '/' Application.

42883: function get_user_by_username(_user_name => character varying, _application_name => character varying, online => boolean) does not exist

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: Npgsql.PostgresException: 42883: function get_user_by_username(_user_name => character varying, _application_name => character varying, online => boolean) does not exist

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[PostgresException (0x80004005): 42883: function get_user_by_username(_user_name => character varying, _application_name => character varying, online => boolean) does not exist]

我使用这个库已经有一段时间了,但这是我第一次看到这个消息。有什么我遗漏的吗?

因此@JGH发现了一个事实,即错误消息中的签名变量名称在库中与发布的代码中略有不同。。。这本不应该发生,但我把源代码拉下来,编译成一个依赖项目,一切都很好。因此,预编译库有一个问题,我可以解决它

谢谢你的帮助

请注意,postgres允许,因此不仅函数名需要存在,而且函数参数的类型也将用于确定要使用的重载,例如

CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)   
它的功能与

CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)
等等

调用这些函数时,参数名、类型和可能的顺序都必须匹配,否则您将得到

Npgsql.PostgresException:42883:函数不存在

另一个一直困扰我的问题是Postgressql在定义函数时的区分大小写规则。例如,在没有任何周围的
引号的情况下,以下函数定义(使用pgAdmin 3中的默认设置):

使用签名注册函数:(使用IDE工具验证)

因此,任何试图在C#中绑定到

command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);
将因错误而失败。相反,您需要绑定所有小写参数,即

command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
除非使用引号定义函数,否则:

CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
这就是为什么在数据库/组织中就套管约定达成一致,然后坚持下去(这是很常见的)对您来说很重要的原因

另一种方法,尽管也容易变得脆弱,但根本不使用命名参数绑定,而是使用参数的顺序位置来绑定它,例如

var myParameter = new NpgsqlParameter
{
    // Leave `ParameterName` out entirely,
    Direction = ParameterDirection.Input,
    IsNullable = false,
    NpgsqlDbType = NpgsqlDbType.Varchar,
    Size = 20,
    Value = "SomeValue"
};
command.Parameters.Add(myParameter);
// Same for other parameter(s)

我也有同样的问题,这里是:

此错误的原因是创建函数后,PostgreSQL会自动将函数名和参数名转换为小写。当Npgsql调用此函数时,函数名不区分大小写,但参数名区分大小写

我花了半天的时间寻找错误的根源。只需将Npgsql从2.2.5升级到4.1.5,PostgreSQL从9升级到13,我的代码就停止使用
42883:函数不存在

在C代码中,我将所有参数都设置为小写


错误消息提到参数
联机
,而不是
\u联机
。。。你是否使用你发布的.net代码(而不是旧版本)?这是一个惊人的观察结果(我没有注意到这种差异),但这些东西的代码多年来都没有改变。我认为pg不太在乎名字,而是在乎类型和顺序,但我可能错了。不知道如何测试。@杰里米:如果你只是将一系列值传递给一个函数,例如
f(1,2)
,那么只有顺序才重要。但是,您也可以按名称指定参数,例如,
f(b:=2,a:=1)
,这使得顺序不相关。参数名称出现在错误消息中这一事实意味着Npgsql正在提供它们,而
\u online
中缺少的
\u
显然是错误的原因。但不知道它去了哪里。。。
command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);
CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))
var myParameter = new NpgsqlParameter
{
    // Leave `ParameterName` out entirely,
    Direction = ParameterDirection.Input,
    IsNullable = false,
    NpgsqlDbType = NpgsqlDbType.Varchar,
    Size = 20,
    Value = "SomeValue"
};
command.Parameters.Add(myParameter);
// Same for other parameter(s)
var data = dataConnection.QueryProc<FormOutput>("get_form_data", new[] {
    new DataParameter("countryid", countryId),
    new DataParameter("keyvalue", key),
    new DataParameter("maxqty", maxFormQty) });

create or replace FUNCTION get_form_data (countryId varchar, key varchar, maxQty int)