2011-06-27 103 views
1

我遇到了一些問題,已添加到更新版本的Castle的ActiveRecord中的SqlNamedQuery屬性。我已指定這樣的:Castle ActiveRecord:'System.Int32'無法轉換爲類型'System.Boolean'

[assembly: SqlNamedQuery(Queries.GetItemName, "EXEC [dbo].[GetItemName] :id")] 

除此之外,我對結果映射屬性聲明:

... 
[Property(Access = PropertyAccess.AutomaticProperty, NotNull = true)] 
public virtual bool IsPrimaryName { get; set; } 
... 

NHibernate的查詢:

IQuery query = Session.GetNamedQuery(Queries.GetItemName); 
query.SetParameter("id", 1212, NHibernateUtil.Int64); 
query.SetResultTransformer(Transformers.AliasToBean<Mapping>()); 

執行後,我收到了以下例外:

Object of type 'System.Int32' cannot be converted to type 'System.Boolean'. 

我還添加了下面的web.config條目但沒有成功(可能只適用於hql查詢)。

<add key="query.substitutions" value="true 1, false 0, yes 'Y', no 'N'" /> 

所以,我的問題是 - 我該如何解決這個問題?存儲過程返回0或1,但我也嘗試了'1','true','TRUE'等。我怎樣才能解決這個問題?或者,也許我應該刪除SqlNamedQueries?

UPDATE:堆棧跟蹤

[ArgumentException: Object of type 'System.Int32' cannot be converted to type 'System.Boolean'.] 
System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast) +4070954 
System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) +9631414 
System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) +151 
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +223 
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +28 
System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) +101 
System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index) +25 
NHibernate.Properties.BasicSetter.Set(Object target, Object value) +68 

UPDATE:Select語句:

SELECT 
     itm.ItemId AS ItemId, 
     itm.Value AS Value, 
     itm.Id AS ParentId, 
     1 AS IsPrimaryName 
FROM  
     [dbo].[Item] AS itm 
... 

正如我上面提到我曾嘗試對SP側多種不同的方案,其中包括:1, 'true','TRUE'+聲明一個BIT變量,並直接從select語句返回它,但它都會失敗,並出現類似的異常。

Thx!

+0

您使用哪種方言和哪種版本的NHibernate? – jishi

回答

4

查詢替換用於將HQL文字映射到SQL,因此它們在這裏不起作用。

你的堆棧跟蹤是不完整的(你吃的內部異常),所以我不能肯定,但我猜的錯誤是GetItemName返回int列您正試圖映射到一個bool財產。

你能從SP發佈有關SELECT,和你的DTO類Mapping(它IS一個DTO,而不是一個映射的實體,對吧?)


更新:你的SELECT語句需要一個投

SELECT ... 
     CAST(1 as bit) IsPrimaryName 
FROM ... 
+0

我已更新原始文章幷包含相關的選擇聲明。在這個特殊情況下,它是一個映射實體,而不是一個Dto--我知道這很糟糕,最終它肯定會成爲一個Dto。 – MonkeyCoder

+0

@MonkeyCoder:查看更新。我對這個事業是對的。 –

+0

謝謝迭戈,它與演員合作正常。你也許知道爲什麼在select語句之外聲明一個位變量並將它返回到它的主體中不起作用?因爲在那之後我只是放棄了在sql-server端出錯的想法。感謝您對此問題的幫助。 – MonkeyCoder

0

只要您確信存儲過程將爲您帶來額外的即席查詢優勢,命名查詢就可以了。 Query.substitution參數正在轉換SQL查詢的數據,而不是返回。你能拿出電話給你嗎?

0

SQL Server支持布爾類型IIRC,那麼爲什麼不重寫存儲過程「GetItemName」來返回一個布爾值呢?

否則我猜你需要修改方言來支持1/0代替真/假。

+0

您能否提供一個示例,我可以如何顯式聲明select語句中的某個返回列是'bit'而不是'int'。我只試圖在select語句之外聲明變量,然後在主體中返回它,但這給了我相同的結果。 – MonkeyCoder

相關問題