SQL Server CEのntext型をサポートするようにDapperを修正しようとしています

dapper sql-server-ce

質問

DapperでSQL Server CEのntext型をサポートする必要があります。問題を説明するスレッドがありますhttps : //code.google.com/p/dapper-dot-net/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Priority%20Milestone %20Owner%20Summary&groupby =&sort =&id = 110

私はDapperを修正して、PetaPocoで使用されている手法と同様のソリューションを使用しようと試みました。https: //github.com/cyotek/PetaPoco/commit/ea13add473be3899ebb73b463d2aff98f8d6d06e

Dapperのソースを調べた後、 DbStringクラスを変更するのが良い方法を決めました。 AddParameter(IDbCommand command, string name)メソッド(行3120から始まる)を次のように変更しました。

public void AddParameter(IDbCommand command, string name)
{
            if (IsFixedLength && Length == -1)
            {
                throw new InvalidOperationException("If specifying IsFixedLength,  a Length must also be specified");
            }
            var param = command.CreateParameter();
            param.ParameterName = name;
            param.Value = (object)Value ?? DBNull.Value;
            if (Length == -1 && Value != null && Value.Length <= 4000)
            {
                param.Size = 4000;
            }
            else
            {
                param.Size = Length;
            }
            param.DbType = IsAnsi ? (IsFixedLength ? DbType.AnsiStringFixedLength : DbType.AnsiString) : (IsFixedLength ? DbType.StringFixedLength : DbType.String);

            if (param.Value != null)
            {
                if (param.Value.ToString().Length + 1 > 4000 && param.GetType().Name == "SqlCeParameter")
                {
                    param.GetType().GetProperty("SqlDbType").SetValue(param, System.Data.SqlDbType.NText, null);  
                }
            }

            command.Parameters.Add(param);
}

私の編集は、タイプをチェックし、それをntextに変更しようとする底部の部分です。しかし、このコードを実行すると、IIS Expressがクラッシュし、asp.netで有用なデバッグ情報が得られません。デバッガで実行しようとしましたが、ヒープの破損に関連するエラーが発生しています。

私は間違ったトラックにいますか? Dapperでこれを試す良い方法はありますか?または、キャッシュやILが生成されるために動作しないものですか?もし私がそれを働かせることができれば、私はプル・リクエストを作成したいと思っていましたが、私は驚いています。


アップデート - 私は1つの潜在的な解決策を見つけました。 DynamicParametersクラスのAddParameters(IDbCommand command, SqlMapper.Identity identity)メソッドにコードを追加しました。メソッドの最終行は次のようになります。

if (s != null)
{
    if (s.Length + 1 > 4000 && p.GetType().Name == "SqlCeParameter")    
    {
        p.GetType().GetProperty("SqlDbType").SetValue(p, SqlDbType.NText, null);
        p.Size = s.Length;
    }
}
if (add)
{
    command.Parameters.Add(p);
}
param.AttachedParam = p;

このソリューションを使用するには、DynamicParametersとしてパラメータを追加する必要があります。だからこそ動作しますが、最も有用な方法ではありません。私はまだもっと良い解決策を探しています。

これは、Dapperの開発者がプルリクエストを作成した場合にパッチとして含めると考えるようなものでしょうか?

人気のある回答

この拡張メソッドを任意のプロパティバッグに試してください:

    public static class DynamicParametersExtensions
{
    public static DynamicParameters AsDynamic(this object propertyBag) {
        var parameters = new DynamicParameters();
        foreach (var property in propertyBag.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) {
            var propertyValue = property.GetValue(propertyBag);
            var propertyValueAsString = propertyValue as string;
            if (propertyValueAsString != null && propertyValueAsString.Length >= 4000) {
                parameters.Add(property.Name, new DbString {
                    Value = propertyValueAsString,
                    Length = propertyValueAsString.Length
                });
            } else {
                parameters.Add(property.Name, propertyValue);
            }
        }
        return parameters;
    }
}

使用例:

connection.Execute(@"UPDATE MyTable SET NTextColumn=@NTextColumn", new { value.NTextColumn }.AsDynamic()); 


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow