2016-08-30 17 views
2

これをサポートする方法があるかどうかわかりませんが、使用していると思われるように、文字列パラメータ値を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 
     }); 
    } 
} 

答えて

4

をあなたはおそらくICustomQueryParameterを拡張CitextParameterを作成作成する必要があります。このAPIを使用すると、任意のDbParameterインスタンスをDapperに渡すことができます。この場合、NpgsqlDbTypeをCitextに設定したNpgsqlParameterのインスタンスになります。このような

何か作業をする必要があります:

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 
     }); 
    } 
} 
+0

を動作するかどうかを確認これは完璧ですありがとうございました!これにはGoogleのヒット件数はあまりなかったので、それは永遠に見つかるだろう。 –

0

を使用すると、SQLクエリを書くとき、あなたはキャスト(citextなど@param)のようなパラメータ値をキャストすることができます。

私の場合、正しく動作しました。あなたのケースでは

string sql = "select * from users where user_name = cast(@user_name as citext) and password = @password;"; 
IEnumerable<users> u = cnn.Query<users>(sql, usr); 

(usrがクラスオブジェクトである)、あなたは以下のようにクエリを変更することができ、かつ

string sql = @"select * from ""dbo"".""MyFunction""(cast(@schemaName as citext), cast(@tableName as citext));"; 
関連する問題