Search code examples
c#ormdapper

Iconvertible Issue with dapper C#


I'm trying to get a value from the database using Dapper but when I execute the query<> instruction I receive an "object must implement Iconvertible" exception. What I'm doing wrong and how I can fix it?

The error occurred when I call the Decrypt method and it call the ExceuteQuery Function.

Code

Program

ServiceSettingsEntity appSetting = MainRepository.GetConfigSettings(appSettingKey.ToString(), companyCode);
    
                   
if (appSetting.IsEncrypted)
    appSetting.Value = MainRepository.Decrypt(appSetting.Value);
    return appSetting.Value.Trim();
                

Decrypt Funtion

public static string Decrypt(string encryptedData)
{

    CommandSettings commandSettings = new CommandSettings
    {
        CommandText = @"[Utility].[DecryptData]",
        CommandType = CommandType.StoredProcedure,
        Parameters = new
                        {
                          @DataToDecrypt = encryptedData
                        }};
        
    return new MsSqlProviderBase(EdxDbConnectionString, 
                 commandSettings).ExecuteQuery<string>().FirstOrDefault();
}
         

ExecuteQuery function used to encapsulate the dapper Query<> function

public List<T> ExecuteQuery<T>()
{
    using (IDbConnection dbConnection = DbConnection)
    {
        List<T> qResult = dbConnection.Query<T>(CommandSettings.CommandText, 
                             CommandSettings.Parameters,                     
                             commandTimeout: CommandSettings.CommandTimeout,
                             commandType: 
                                CommandSettings.CommandType).ToList();
                
return qResult;
    }
} 

Solution

  • (Based on expanded info in comments.) Most IDbConnection implementations will (correctly) "translate" SQL varbinary to C# byte[]. byte[] and string are not immediately convertible, because natural language text is complex.

    You will need to translate your string to a byte[] and vice-versa using an encoding before the underlying stored procedure is usable.

    See Microsoft Docs. The upshot: once you select an encoding, you'll use the GetBytes(string) and GetString(byte[]) methods to en/decode the text going into and coming out of the stored procedure.