4

我正在尝试使用 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)...

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

4

4 回答 4

5

您将 Unicode 参数传递给 ASCII 参数。

更改此行:

parameter.DbType = System.Data.DbType.String;

至:

parameter.DbType = System.Data.DbType.AnsiString;

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

于 2009-08-25T12:02:12.393 回答
2

您使用的是哪个 Npgsql 版本?

另外,您可以使用 NpgsqlDbType 指定参数类型吗?有时映射不准确,Npgsql 找不到您尝试使用的功能,无法使其工作。

Npgsql 试图找到函数名称和参数类型的完全匹配。DbString 匹配文本参数类型。您介意尝试一下并将您的参数类型更改为文本吗?

我希望它有所帮助。

于 2010-03-05T18:38:09.463 回答
1

不确定,如果这与您的问题有关,但昨天我偶然发现PostgreSQL有一个与 char(1) 类型不同的“单字节内部类型”char。也许对这些有一些困惑?

于 2009-09-01T08:30:11.433 回答
0

我尝试了以下方法(与您的方法相似):

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。

于 2017-08-30T08:56:50.220 回答