2012年7月17日 星期二

linq dbml IsComposable 屬性

專案是使用linq to sql建立dmbl .

某天由資料庫主機更新某幾個Stored Procedure的dmbl定義後,
某一隻程式在儲存時會呼叫到更新後的Stored Procedure. 結果一直出現下列的錯誤

找不到資料行 "dbo" 或者使用者自訂函數或彙總 "dbo.zspXXXXX",或是名稱模糊不清。

但檢查了資料庫的SP定義和dbml中的定義完全是一樣的啊,怎麼會找不到咧??

於是打開dbml檔的XXXXX.designer.cs 查看, 發現呼叫的SP和其他SP比較後,多了一個屬性的定義 IsComposable="true"如下:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.zspXXXX" , IsComposable="true")]
        public int zspXXXX([global::System.Data.Linq.Mapping.ParameterAttribute(DbType="SmallInt")] System.Nullable<short> orgn, [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="SmallInt")] System.Nullable<short> ym , [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="SmallInt")] System.Nullable<short> isAuto)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), orgn, ym, isAuto);
            return ((int)(result.ReturnValue));
        }


根據MSDN上的定義,

IsComposable 屬性 是取得或設定方法是對應至函式,還是對應至預存程序。如果是函式,則為 true,如果是預存程序,則為 false。 


看來預設是false. 


將這個屬性移除後, 重新compile, 呼叫SP就正常了.

沒有留言:

張貼留言

publish error allowDefinition='MachineToApplication'

一個老舊的aspx web form專案,調了一些功能建置成功,但進行部署時顯示以下錯誤。 在應用程式層級之外使用註冊為 allowDefinition='MachineToApplication' 的區段發生錯誤。錯誤的原因可能是虛擬目錄尚未在 IIS 中設定為...