Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, dies zu unterstützen, aber ich habe Probleme, Dapper dazu zu bringen, String-Parameterwerte dem Postgresql-Citext-Datentyp zuzuordnen, da es den Texttyp zu verwenden scheint.
Insbesondere versuche ich eine Funktion aufzurufen, die citext-Parameter akzeptiert - der Fehler, den ich zurückbekomme, ist:
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.
Die Signatur, die übereinstimmen würde, ist die Funktion dbo.MyFunction (citext, citext), so dass sie mit der Standardzuordnung nicht gefunden werden kann.
Laut Npgsql - http://www.npgsql.org/doc/types.html muss ich in der Lage sein, NpgsqlDbType.Citext als Typ anzugeben, aber ich finde keine Möglichkeit, dies mit Dapper zu tun.
Gelöst dank Antwort von Shay, komplette Lösung hier:
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
});
}
}
Sie müssen wahrscheinlich ein CitextParameter erstellen, das ICustomQueryParameter erweitert. Mit dieser API können Sie eine beliebige DbParameter-Instanz an Dapper übergeben - in diesem Fall wäre es eine Instanz von NpgsqlParameter mit der Einstellung NpgsqlDbType auf Citext.
So etwas sollte funktionieren:
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
});
}
}
Wenn Sie die SQL-Abfrage schreiben, können Sie den Parameterwert wie cast (@param als citext) umwandeln.
in meinem Fall funktionierte das richtig. (usr ist ein Klassenobjekt)
string sql = "select * from users where user_name = cast(@user_name as citext) and password = @password;";
IEnumerable<users> u = cnn.Query<users>(sql, usr);
In Ihrem Fall können Sie die Abfrage wie folgt ändern und sehen, ob das funktioniert
string sql = @"select * from ""dbo"".""MyFunction""(cast(@schemaName as citext), cast(@tableName as citext));";