我不确定是否有方法支持这一点,但是我很难让Dapper将字符串参数值映射到Postgresql citext数据类型,因为它似乎正在使用文本类型。
特别是,我试图调用一个接受citext参数的函数-返回的错误是:
var c = ConnectionManager<T>.Open();
string sql = @"select * from ""dbo"".""MyFunction""(@schemaName, @tableName);";
var param = new
{
schemaName = schema,
tableName = table
};
string insecureSalt = c.QueryMultiple(sql, param).Read<string>().FirstOrDefault();
ConnectionManager<T>.Close(c);
Error: Npgsql.PostgresException: 42883: function dbo.MyFunction(text, text) does not exist.
匹配的签名是函数dbo.MyFunction(citext,citext),很明显它无法使用默认映射找到它。
根据Npgsql-http://www.npgsql.org/doc/types.html我需要能够指定NpgsqlDbType.Citext作为类型,但是我找不到使用Dapper的方法。
通过Shay的回答解决了问题,完整的解决方案如下:
var c = ConnectionManager<T>.Open();
string sql = @"select * from ""dbo"".""MyFunction""(@schemaName, @tableName);";
var param = new
{
schemaName = new CitextParameter(schema),
tableName = new CitextParameter(table)
};
string insecureSalt = c.QueryMultiple(sql, param).Read<string>().FirstOrDefault();
ConnectionManager<T>.Close(c);
public class CitextParameter : SqlMapper.ICustomQueryParameter
{
readonly string _value;
public CitextParameter(string value)
{
_value = value;
}
public void AddParameter(IDbCommand command, string name)
{
command.Parameters.Add(new NpgsqlParameter
{
ParameterName = name,
NpgsqlDbType = NpgsqlDbType.Citext,
Value = _value
});
}
}
最佳答案
您可能需要创建扩展ICustomQueryParameter的CitextParameter。此API允许您将任意DbParameter实例传递给Dapper—在本例中,它将是NpgsqlParameter的实例,其NpgsqlDbType设置为Citext。
这样的做法应该管用:
class CitextParameter : SqlMapper.ICustomQueryParameter
{
readonly string _value;
public CitextParameter(string value)
{
_value = value;
}
public void AddParameter(IDbCommand command, string name)
{
command.Parameters.Add(new NpgsqlParameter
{
ParameterName = name,
NpgsqlDbType = NpgsqlDbType.Citext,
Value = _value
});
}
}