2012-09-11 33 views
1

因此,我試圖使用nhibernate來調用存儲過程來保存圖像。我的問題是,查詢失敗,此錯誤:帶有byte []參數的NHibernate ISQLQuery拋出錯誤

The length of the byte[] value exceeds the length configured in the mapping/parameter.

這裏就是我附上我的參數給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),我試圖在「字節[]」發送的數據。

我試過使用特定的SetBinary,但這失敗了。所有其他數據類型似乎都在工作。

我也嘗試了query.SetParameter<byte[]>(parameter.Key, (byte[])parameter.Value);與相同的錯誤。

回答

1

NHibernate不會奇蹟般地知道數據庫中的數據類型是varbinary(max)。你需要在你的映射中指定足夠大的長度(我認爲默認是8000字節)。

2

這是一個有點老的問題,但我把我的答案給新的搜索者。

爲字節[]參數,你可以指定長度,你需要確保該程序的參數具有足夠的長度

+0

非常感謝您對這個這樣

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

。一直在尋找幾個小時,看着映射,但這不適用於Session.CreateSqlQuery。我只是使用了NHibernate.Type.TypeFactory.GetBinaryType(int.MaxValue),而不是獲取字節數組的長度。 –