Npgsql 4.1.17:可空类型参数调用重载存储过程的匹配问题
解决Npgsql 4.x中null参数匹配PostgreSQL重载函数的问题
我有以下PostgreSQL的重载函数function1:
function1(par1 Enum_1), function1(par1 integer), ... function1(par1 text)
在Npgsql 3.2.7版本中,能通过指定NpgsqlDbType.Enum创建参数,示例如下:
_sqlcmd.Parameters.AddWithValue("@par1_", NpgsqlTypes.NpgsqlDbType.Enum, par1_.HasValue ? (object)par1_ : DBNull.Value);
这种方式哪怕参数是null,也能精准匹配对应的重载——因为明确指定了参数类型。但升级到Npgsql 4.1.17后,NpgsqlDbType.Enum被移除,导致参数为null时没法明确匹配目标重载。除了给函数重命名外,还有这些解决方案:
显式指定枚举类型名称
添加参数时,用NpgsqlParameter的DataTypeName属性指定PostgreSQL里枚举类型的具体名称(比如Enum_1)。这样就算参数是null,Npgsql也能识别目标类型,匹配正确的重载。代码示例:var param = new NpgsqlParameter("@par1_", par1_.HasValue ? (object)par1_ : DBNull.Value); param.DataTypeName = "Enum_1"; // 填写PostgreSQL中定义的枚举类型名 _sqlcmd.Parameters.Add(param);调用函数时显式转换参数类型
在SQL语句里调用函数时,直接把null参数强制转换为目标枚举类型,让PostgreSQL明确知道要匹配哪个重载。示例SQL:SELECT function1(@par1_::Enum_1);对应的C#代码不用额外指定类型,直接加参数就行:
_sqlcmd.Parameters.AddWithValue("@par1_", par1_.HasValue ? (object)par1_ : DBNull.Value);用命名参数加类型提示
在SQL命令文本里,结合命名参数和类型转换,进一步明确参数类型。比如:_sqlcmd.CommandText = "SELECT function1(par1 => @par1_::Enum_1)"; _sqlcmd.Parameters.AddWithValue("@par1_", par1_.HasValue ? (object)par1_ : DBNull.Value);
内容的提问来源于stack exchange,提问作者Ruebezaehler
相关产品推荐
相关产品推荐

