[英]Using npgsql to call a function that takes character as parameter
我试图使用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;
这是我正在使用的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();
我已经尝试将参数声明为CHARACTER,CHARACTER(10),CHARACTER VARYING和CHARACTER VARYING(10)......
编辑:我没有得到任何错误消息,但我没有获得预期的结果集,而是获得一个空的结果集,其中包含一个与我试图调用的函数同名的列。
您正在将Unicode参数传递给ASCII参数。
改变这一行:
parameter.DbType = System.Data.DbType.String;
至:
parameter.DbType = System.Data.DbType.AnsiString;
通常,Postgres的varchar
列是Unicode格式,前提是数据库上的Unicode选项已启用( 请参阅此处 )。 我的猜测是,它不是,并且您的参数无法将自身转换为要通过函数传递的正确类型。
您使用的是哪个Npgsql版本?
另外,您可以使用NpgsqlDbType指定参数类型吗? 有时映射不完全,Npgsql找不到您尝试使用的功能,无法使其正常工作。
Npgsql尝试查找函数名称和参数类型的完全匹配。 DbString匹配文本参数类型。 您是否介意尝试将参数类型更改为文本?
我希望它有所帮助。
不知道,如果这与你的问题做的,但昨天我碰到的偶然其实是PostgreSQL有一个“单字节内部类型”焦炭是从类型char(1)不同。 也许这些有些混乱?
我尝试使用以下方法(与您的类似):
using (NpgsqlConnection connection = new NpgsqlConnection(< connectionString >))
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
connection.Open();
NpgsqlCommand cmd = new NpgsqlCommand(< name of your SP >, connection);
cmd.CommandType = CommandType.StoredProcedure;
var param = cmd.CreateParameter();
param.ParameterName = < exact parameterName you used in your SP>;
param.DbType = System.Data.DbType.AnsiString;
param.Value = < parameter value >;
cmd.Parameters.Add(param);
NpgsqlDataAdapter adapter = new NpgsqlDataAdapter(cmd);
adapter.Fill(ds);
dt = ds.Tables[0];
}
这对我来说很好,我得到了正确的DataTable。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.