1

そのため、nhibernateを使用して、画像を保存するストアドプロシージャを呼び出そうとしています。私の問題は、クエリが次のエラーで失敗することです。

byte []値の長さが、マッピング/パラメーターで構成された長さを超えています。

ここで、パラメータをに添付しますISQLQuery。パラメータはDictionary<string, object>です。

public void Execute()
{

    string sql = BuildSprocDefinition();
    var query = Session.CreateSQLQuery(sql);

    foreach (var parameter in Parameters)
    {
        if (parameter.Value is int)
            query.SetParameter<int>(parameter.Key, (int)parameter.Value);
        else if (parameter.Value is long)
            query.SetParameter<long>(parameter.Key, (long)parameter.Value);
        else if (parameter.Value is bool)
            query.SetParameter<bool>(parameter.Key, (bool)parameter.Value);
        else if (parameter.Value is byte[])
            query.SetBinary(parameter.Key, (byte[])parameter.Value);
        else
            query.SetParameter(parameter.Key, parameter.Value);
    }

    using (var tx = Session.BeginTransaction())
    {
        query.ExecuteUpdate();
        Session.Flush();
        tx.Commit();
    }
}

protected string BuildSprocDefinition()
{
    StringBuilder sql = new StringBuilder(String.Format("exec {0} ", storedProcName));

    foreach (var parameter in Parameters)
    {
        sql.Append(String.Format(":{0}, ", parameter.Key));
    }

    if (sql.ToString().EndsWith(", "))
    {
        sql = sql.Remove(sql.Length - 2, 2);
    }

    return sql.ToString();
}

データベースでは、パラメータはtypevarbinary(max)であり、データとして「byte[]」を送信しようとしています。

特定のを使用しようとしましたが、SetBinaryこれは失敗します。他のすべてのデータ型は機能しているようです。

私もquery.SetParameter<byte[]>(parameter.Key, (byte[])parameter.Value);同じエラーで試しました。

4

2 に答える 2

5

それは少し古い質問ですが、私は新しい検索者のために私の答えを置きます。

byte []パラメーターの場合、この方法で長さを指定できます

query.SetParameter(parameter.Key, parameter.Value, NHibernate.Type.TypeFactory.GetBinaryType(((byte[])parameter.Value).Length));

プロシージャパラメータの長さが十分であることを確認する必要があります

于 2015-02-17T12:17:11.983 に答える
1

NHibernateは、データベース内のデータ型がvarbinary(max)であることを魔法のように知りません。マッピングで十分な長さを指定する必要があります(デフォルトは8000バイトだと思います)。

于 2012-09-11T17:02:09.047 に答える