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)......
编辑:我没有得到任何错误消息,但我没有获得预期的结果集,而是获得一个空的结果集,其中包含一个与我试图调用的函数同名的列.
您正在将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选项已启用(请参阅此处).我的猜测是,它不是,并且您的参数无法将自身转换为要通过函数传递的正确类型.