2016-08-30 89 views
2

我不確定是否有辦法支持此操作,但是我無法使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 
     }); 
    } 
} 

回答

4

你可能需要創建創建延伸ICustomQueryParameter一個CitextParameter。此API允許您將任意DbParameter實例傳遞給Dapper - 在這種情況下,它將是NpgsqlDrameType的實例,其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 
     }); 
    } 
} 
+0

這是完美的謝謝!谷歌沒有大量的點擊量,所以它會花費很長時間才能找到。 –

0

當你寫的SQL查詢,您可以施放像蒙上了(@參數爲citext)參數值。

在我的情況下,以下工作正常。 (USR是類對象)

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

在你的情況,你可以更改查詢像下面,看看是否能工程

string sql = @"select * from ""dbo"".""MyFunction""(cast(@schemaName as citext), cast(@tableName as citext));"; 
相關問題