使用npgsql调用以字符作为参数的函数

Ant*_*bry 4 c# database postgresql mono npgsql

我试图使用Npgsql来调用一个以CHARACTER作为参数的函数(存储过程),但它不起作用.如果我声明没有参数的相同函数,或者使用INTEGER参数,我会得到我想要的结果集.当我将参数声明为CHARACTER时,它将停止工作.怎么了?

这是我的函数的代码:

CREATE OR REPLACE FUNCTION testrefcursor1(in xxx character varying(10)) RETURNS SETOF refcursor AS
$$
DECLARE 
  ref1 refcursor;
  ref2 refcursor;
BEGIN

OPEN ref1 FOR 
 SELECT * FROM accounts;
RETURN NEXT ref1;

OPEN ref2 FOR 
 SELECT * FROM accounts;
RETURN NEXT ref2;

RETURN;
END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的C#代码:

var connection = new Npgsql.NpgsqlConnection(connectionString.ConnectionString);

connection.Open();
var trans = connection.BeginTransaction();

var command = new Npgsql.NpgsqlCommand("testrefcursor1", connection);
command.CommandType = System.Data.CommandType.StoredProcedure;

var parameter = command.CreateParameter();
parameter.ParameterName = "xxx";
parameter.DbType = System.Data.DbType.String;
parameter.Value = "10";
command.Parameters.Add(parameter);

var da = new Npgsql.NpgsqlDataAdapter(command);
var ds = new System.Data.DataSet();
da.Fill(ds);

trans.Commit();
connection.Close();
Run Code Online (Sandbox Code Playgroud)

我已经尝试将参数声明为CHARACTER,CHARACTER(10),CHARACTER VARYING和CHARACTER VARYING(10)......

编辑:我没有得到任何错误消息,但我没有获得预期的结果集,而是获得一个空的结果集,其中包含一个与我试图调用的函数同名的列.

Eri*_*ric 5

您正在将Unicode参数传递给ASCII参数.

改变这一行:

parameter.DbType = System.Data.DbType.String;
Run Code Online (Sandbox Code Playgroud)

至:

parameter.DbType = System.Data.DbType.AnsiString;
Run Code Online (Sandbox Code Playgroud)

通常,Postgres的varchar列是Unicode格式,前提是数据库上的Unicode选项已启用(请参阅此处).我的猜测是,它不是,并且您的参数无法将自身转换为要通过函数传递的正确类型.