2012-03-09 17 views
2

データが8000バイトを超えるBLOBを使用する場合は、具体的にParameter.SqlDbType = SqlDbType.Imageを設定して動作させる必要があります(as explained here)。BLOBとSQL Server CEでDapperを使用する

Dapperの場合、byte[]フィールドが表示されると、デフォルトではSqlDbType.Binaryになります。これは、より大きなBLOBの場合、データの切り捨てエラーで挿入と更新が失敗することを意味します。

この問題の解決策はありますか?私が見ることができるオプションは、ADO.NETメソッドでトランザクション全体をコーディングすることだけです。

+0

をあなたはDapperのソース(http://code.google.com/p/dapper-dot-net/source/browse/Dapper/SqlMapper.cs)を見てみる場合は、可能性が次のように解決されました適切なSqlDbTypeを返す関数 "LookupDbType"に特殊なケースを追加します。しかし、何か別のものが壊れてしまったら、手がかりはありません。 – Alex

+0

ありがとう! 私は静的なSqlMapperコンストラクタを変更し、次の行を変更すると思います:typeMap [typeof(byte [])] = DbType.Binary; – Sameera

+2

ああ、それは痛みです。私はあなたがより良いものとしてバグとしてこれを記録するかもしれないと思う –

答えて

0

私は同じ問題がありました。

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; 
    }