繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM