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

在数据库中,我的参数是类型varbinary(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 回答