我不確定是否有辦法支持此操作,但是我無法使Dapper將字符串參數值映射到Postgresql citext數據類型,因爲它似乎正在使用文本類型。使用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執行此操作的方法。
解決由於從吉文回答,這裏完整的解決方案:
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
});
}
}
這是完美的謝謝!谷歌沒有大量的點擊量,所以它會花費很長時間才能找到。 –