Использование Dapper с BLOB и SQL Server CE

При использовании больших двоичных объектов с более чем 8000 байтами данных вам необходимо специально установить Parameter.SqlDbType = SqlDbType.Image, чтобы он работал (как описано здесь).

Dapper, когда он видит поле byte[], по умолчанию принимает значение SqlDbType.Binary, что означает, что для больших BLOB-объектов вставки и обновления завершатся ошибкой усечения данных.

Есть ли элегантное решение этой проблемы? Единственный вариант, который я вижу, - это закодировать всю транзакцию с помощью методов ADO.NET.


person Sameera    schedule 09.03.2012    source источник
comment
Если вы посмотрите на исходный код dapper ( code.google.com/p/dapper-dot-net/source/browse/Dapper/ ) можно добавить особый случай в функцию LookupDbType, возвращающую соответствующий SqlDbType. Не знаю, сломает ли он что-то еще.   -  person Alex    schedule 09.03.2012
comment
Спасибо! Я думаю, что изменю статический конструктор SqlMapper и изменю следующую строку: typeMap[typeof(byte[])] = DbType.Binary;   -  person Sameera    schedule 10.03.2012
comment
О, это боль; Я подозреваю, что вам лучше зарегистрировать это как ошибку против dapper, хотя   -  person Marc Gravell    schedule 12.03.2012


Ответы (1)


У меня такая же проблема. Решено следующим образом:

private static IDbCommand SetupCommand(IDbConnection cnn, IDbTransaction transaction, 
                                       string sql, Action<IDbCommand, object> paramReader, 
                                       object obj, int? commandTimeout, 
                                       CommandType? commandType)
{
    var cmd = cnn.CreateCommand();
    var bindByName = GetBindByName(cmd.GetType());
    if (bindByName != null) bindByName(cmd, true);
    if (transaction != null)
        cmd.Transaction = transaction;
    cmd.CommandText = sql;
    if (commandTimeout.HasValue)
        cmd.CommandTimeout = commandTimeout.Value;
    if (commandType.HasValue)
        cmd.CommandType = commandType.Value;
    if (paramReader != null)
    {
        paramReader(cmd, obj);
    }
    //CODTEC SISTEMAS
    foreach (System.Data.SqlServerCe.SqlCeParameter item in cmd.Parameters)
    {
        if (item.SqlDbType == System.Data.SqlDbType.VarBinary)
            item.SqlDbType = System.Data.SqlDbType.Image;
    }
    //CODTEC SISTEMAS
    return cmd;
}
person user2421145    schedule 16.06.2014