3k0010-單據(jù)開發(fā)常用編程接口_第1頁
3k0010-單據(jù)開發(fā)常用編程接口_第2頁
3k0010-單據(jù)開發(fā)常用編程接口_第3頁
3k0010-單據(jù)開發(fā)常用編程接口_第4頁
3k0010-單據(jù)開發(fā)常用編程接口_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、單據(jù)開發(fā)(編程接口)課程編號: 課程概述 后臺組件編程基礎(chǔ) 前臺組件編程基礎(chǔ) 專題研究主題 課程概述 后臺組件編程基礎(chǔ) 前臺組件編程基礎(chǔ) 專題研究主題課程概述課程目標在自定義單據(jù)(初級)課程基礎(chǔ)之上,理解前后臺編程接口和編程方法,深入挖掘單據(jù)開發(fā)功能課程內(nèi)容內(nèi)容涵蓋前后臺模型開發(fā),前后臺編程基礎(chǔ);聽課基礎(chǔ)自定義單據(jù)(初級),OQL語言,C#項目開發(fā)考查目標 課程概述 后臺組件編程基礎(chǔ) 前臺組件編程基礎(chǔ) 專題研究主題實體對外結(jié)構(gòu)的基礎(chǔ)組成實體的Key(強類型的EntityKey)實體的查詢類Finder實體的強類型集合EntityList實體的資源屬性和強類型訪問屬性的輔助類EntityRes實

2、體的OriginalData實體的狀態(tài)SysStateSessionSession的概念在現(xiàn)在UBF中,Session的本意是work unit,即持久層的一個邊界,非常輕,主要用作批量提交,并標識這次批量提交的邊界,不涉及到事務(wù)等概念。當前ISession可以通過Session的Current屬性獲得,每調(diào)用一次Session的Open方法,Current屬性都會被更新Session的使用 using(ISession session = Session.Open () . mit();/提交更改,但只是Session范圍內(nèi)的修改更新 Session嵌套當發(fā)生session嵌套的情況時,每次

3、提交都是真正提交示例: using(ISession session1 = Session.Open () . using(ISession session2 = Session.Open () . mit();/提交更改,但只是Session2范圍內(nèi)的修改更新 mit();/提交更改,只處理Session1的修改更新 實體新建新建實體實體的操作分為主實體的新建和非主實體的新建,如果是主實體新建,用不帶參數(shù)的Create方法,如果是非主實體的,用帶上級實例參數(shù)的Create方法。舉例:using (ISession session = Session.Open() 1c1 objA = 1c1

4、.Create();objA.Code_ 1c1 = 1000; objA.Name_ 1c1 = objA“; 1c1 objB = 1c1.Create(objA)/B為A的子實體 objB.Code_ 1c1 = 1001; objB.Name_ 1c1 = “objB”; mit(); 最好在Session中創(chuàng)建實體更新using(ISession session = Session.Open () Customer obj = Customer.Finder.FindByID(id); if(obj!=null) obj.Name = new name; session.Modify

5、(obj); . . mit();實體刪除對于組合關(guān)系,如果刪除主實體,那么,主實體下面的所有子實體,孫實體會被級聯(lián)刪除, 對于非主實體的刪除,可以用子集合的RemoveAt和Remove(entity)方法,這2個方法等價,例如using (ISession session = Session.Open() 1cN objA = 1cN.Finder.FindByID(aID); 1cN.RemoveAt(0);/或用下面的方式: 1cN b = Com1cN.Finder.FindByID(bID); 1cN.Remove(b); mit();實體查詢方式實體的查詢類FinderEntit

6、yDataQueryEntityQueryEntityViewQuery實體查詢實體的查詢類Finder返回強類型的對象常用方法:Find,F(xiàn)indByID,F(xiàn)indAll舉例 OqlParamList pList = new OqlParamList();string strOql = “Code=Code;pList.Add(new OqlParam(“Code”, “11”);Customer.EntityList list=Customer.Finder.FindAll(strOql, pList.ToArray();實體查詢EntityDataQueryEntityDataQuery

7、 主要用于希望返回結(jié)果是IDataReader,DataSet,單值的情況創(chuàng)建方式: 1、通過Entity對象: EntityDataQuery q = Customer.Finder.CreateDataQuery(); 2、通過EntityFullName: EntityDataQuery q = new EntityDataQuery(UFIDA.U9.CBO.SCM.Customer.Customer); EntityDataQuery q = new EntityDataQuery(Customer.EntityRes.BE_FullName);返回DataSet:FindDataS

8、et 1、全OQL方式 DataSet ds =q.FindDataSet(“select ID,Name,Code from UFIDA:U9:CBO:SCM:Customer:Customer); 2、條件OQL方式 DataSet ds = q.FindDataSet( ID1);實體查詢EntityDataQuery返回IDataReader :FindDataReader 1、全OQL方式 IDataReader dr = q.FindDataReader (select ID,Name,Code from UFIDA:U9:CBO:SCM:Customer:Customer); 2

9、、條件OQL方式 IDataReader dr = q.FindDataReader ( ID1);返回單值: q.FindValue(select Max(ID) where id 111);分頁查詢: DataSet ds = q.FindDataSetByPage(1, 2, ID ID and Name = mmm order by ID);實體查詢EntityQuery主要用于希望返回的結(jié)果是實體(弱類型)以強類型的方式使用Customer.Finder,其對外接口和功能與EntityQuery類似,只是Customer.Finder返回強類型的對象,EntityQuery返回弱類型

10、的對象。創(chuàng)建方式: 1、通過Entity對象: EntityQuery eq = Customer.Finder.CreateQuery(); 2、通過EntityFullName: EntityQuery q = new EntityQuery(UFIDA.U9.CBO.SCM.Customer.Customer); EntityQuery q = new EntityQuery(Customer.EntityRes.BE_FullName);實體查詢EntityQuery返回實體:FindByID和FindFindByID ,先從緩存加載對象,如果緩存沒有,則從數(shù)據(jù)庫加載對象;Custom

11、er a = Customer.Finder.FindByID(a.ID);Customer a = (Customer)eq.FindByID(a.ID);Find方式,直接從數(shù)據(jù)庫加載, 然后查緩存,如果緩存有,用緩存對象替換;Customer.Finder.Find(“ID = ID”);eq.Find(ID = ID”);返回實體集合條件OQL方式:q = new EntityQuery(Customer.EntityRes.BE_FullName);q.FindAll(“ID 1 );實體操作持久化引擎實體資源理解實體資源實體資源的訪問/取實體ID的資源string str = Cu

12、stomer.EntityRes.GetResource(Customer.EntityRes.ID);/取實體全名的資源 str = Customer.EntityRes.GetResource(Customer.EntityRes.BE_Name); /取枚舉的資源 str = Customer.EntityRes.GetResource(Customer.EntityRes.Name); str = Customer.EntityRes.GetResource(Customer.EntityRes.ExtEnum); str = Customer.EntityRes.GetResourc

13、e(Customer.EntityRes.ExtEnum_ExtNum1); /取屬性類型的資源 str = Customer.EntityRes.GetResource(Customer.EntityRes.PropertyType); str = Customer.EntityRes.GetResource(Customer.EntityRes.PropertyType_PropertyType1);實體資源為什么要使用實體資源類?強類型的方式訪問屬性名;減少手動的誤差提高程序健壯性舉例EntityDataQuery q = new EntityDataQuery(Customer.Ent

14、ityRes.BE_FullName);EntityDataQuery q = new EntityDataQuery(“UFIDA.U9.CBO.SCM.Customer.Customer”); q.Select(Customer.EntityRes.Name);q.Select(“Name”); q.Parameters.Add(new UFSoft.UBF.PL.OqlParam(“1”); object value = q.FindValue(Customer.EntityRes.Bargain +“=”+ Customer.EntityRes.Bargain);object valu

15、e = q.FindValue(“Bargain = Bargain”);實體校驗實體本身的業(yè)務(wù)校驗通過在實體Extend代碼中的OnValidate方法中定義校驗業(yè)務(wù)邏輯來實現(xiàn)平臺統(tǒng)一校驗非空校驗引用對象的存在性校驗(關(guān)聯(lián)實體,枚舉對象)敏感字段校驗事件擴展方法實體的事件在子類上會自動生成事件擴展方法OnSetDefaultValue(),OnInserting(),OnInserted(), OnUpdating()OnUpdated(), OnDeleting(),OnDeleted()這些方法提供了編寫實體業(yè)務(wù)邏輯的入口擴展方法的一些規(guī)則實體的OnSetDefaultValue方法只關(guān)

16、注對自身和下級的影響,如果有涉及到兄弟行或父實體的邏輯,需要移交到父實體的OnSetDefaultValue在后事件(OnInserted/ OnUpdated / OnDeleted)中 不允許在當前session范圍內(nèi)對實體本身的屬性再進行修改,但可以調(diào)用服務(wù)修改(慎用)事件順序U9平臺異常介紹屬性空效驗異常:AttrNotNullableException:顯示為 XXX 不能為空,請錄入; 例如:部門界面的編碼字段不能為空,但是為空時保存了,則錯誤信息為編碼不能為空,請錄入權(quán)限異常:AuthorityAddException :顯示為實體XXX 未授權(quán),不能新增記錄;Authority

17、DeleteException: 實體XXX 未授權(quán),不能刪除記錄;AuthorityUpdateException: 實體XXX 未授權(quán),不能修改記錄;例如:實體收款單未授權(quán),不能新增記錄。引用檢查異常:CascadeDeleteException :當前XXX已被使用,不能刪除;CascadeModifyException :當前XXX 已被使用,不能修改;例如:部門a已經(jīng)被業(yè)務(wù)員甲引用,則刪除部門a時,出錯信息為當前部門已被使用,不能刪除。業(yè)務(wù)主鍵重復(fù)異常: SqlUniqueKeyException :XXX 已存在,請重新錄入; 例如:部門檔的主健是組織+編碼,則出錯信息為組織+編碼

18、已存在,請重新錄入。引用有效性異常: RefObjectInValidException : XXX不存在,請重新錄入;例如:業(yè)務(wù)員甲引用了部門a,但是在保存業(yè)務(wù)員甲時,部門a已經(jīng)被刪除了,這時出錯信息是部門不存在,請重新錄入。 課程概述 后臺組件編程基礎(chǔ) 前臺組件編程基礎(chǔ) 專題研究主題UI生成代碼框架與MVC的關(guān)系Form生成UIModel生成ViewModelControllerForm生成的代碼框架結(jié)構(gòu)生成的代碼Page ControllerView編寫代碼邏輯UIModel生成的代碼框架結(jié)構(gòu)生成的代碼ControllerModel編寫代碼邏輯Extend編寫代碼邏輯UI代碼寫入時機We

19、bPart事件事件擴展出的接口OnInit()OnLoad()OnPreRender()控件事件CreateFormChildControls()AfterCreateChildControls()OnLoadData_Extend()AfterOnLoad()BeforeUIModelBinding()AfterUIModelBinding()DataBinding()!Page.IsPostBackIsDataBinding控件事件ExtendActionExtendEventBind()UI代碼寫入時機UIForm擴展方法可寫的邏輯AfterCreateChildControls()創(chuàng)建

20、控件樹,創(chuàng)建關(guān)聯(lián)控件OnLoadData_Extend()非PostBack狀態(tài)下創(chuàng)建控件樹,加載數(shù)據(jù)AfterOnLoad()創(chuàng)建控件樹的最后機會,也可以加載數(shù)據(jù),修改控件屬性事件Extend()事件響應(yīng)業(yè)務(wù)邏輯BeforeUIModelBinding()修改模型數(shù)據(jù)最后的機會,否則不會反映到控件上,修改控件屬性AfterUIModelBinding()修改控件屬性AfterEventBind()綁定事件ActionExtend()默認通用邏輯,可擴展ModelExtend()對Model中視圖的修改,如默認值UIModel編程如何訪問UIModel?在Action基類中,有CurrentM

21、odel屬性,可以在某個ActionExtend方法中中這樣訪問UIModel:this.CurrentModel;在WebPart的CodeBehind中訪問this.Model,得到強類型的UIModel;通過UIModel,即可以以強類型或弱類型的方式訪問得到UIView和Link集合;可以訪問UIModel的屬性、UIModel下UIView的屬性、以及UIField屬性;UIView是數(shù)據(jù)的具體對象與接口:OQlString、DefaultFilter、對應(yīng)EntityFullName、ParentLink、Childlinks、ParentView、FocusedRecord、Fo

22、cusedIndex、FocusRecord、Records等;UIView可以強名訪問字段,也可以弱類型訪問字段;UIModel數(shù)據(jù)收集與界面綁定對于Action操作,可以在設(shè)計期設(shè)置該Action操作是否要收集數(shù)據(jù)和綁定數(shù)據(jù);BaseWebForm實現(xiàn)IPart接口,有DataCollect()、DataBanding()方法和IsDataBanding屬性,負責收集數(shù)據(jù)、界面綁定;可以在WebPart的CodeBehindExtend代碼的相應(yīng)方法中編程,調(diào)用this.DataCollect()、this.DataBanding()等方法,完成數(shù)據(jù)收集與綁定;操作UIModelUIMod

23、el賦值、賦默認值和其他屬性在*ModelExtend.cs文件中AfterInitModel()方法中設(shè)置字段的defaultValue在AfterInitModel()中完成對UIModel的默認值的設(shè)置:public override void AfterInitModel() /默認值 anization.FieldEffective_EffectiveDate.DefaultValue = PlatformContext.Current.DateTime; anization.FieldIsLegacyOrg.DefaultValue = true;也可以在Action方法中直接對U

24、IModel的字段賦值、賦默認值;方式同上;操作UIModel在卡片界面做“新增”等操作時,需要增加一條空Record,這條空記錄與界面完成綁定,達到清空界面的效果,例如,清空主Form的Card容器界面的處理:int index = this.MainView.FocusedIndex;IUIRecord newRecord = this.MainView.NewUIRecord();if(this.MainView.RecordCount = 0 | index 0)index = 0;this.MainView.Records.Insert(index, newRecord);this.

25、MainView.FocusedRecord = newRecord;操作UIModelUIView與Record的處理:/UIView從DataTable、UIView中復(fù)制this.MainView.FromDataTable(DataTable table);this.MainView.FromUIView(UIView view);/復(fù)制到DataTablethis.MainView.ToDataTable(DataTable table);/UIRecord與DataRow復(fù)制UIRecord.FromDataRow(DataRow dataRow);UIRecord.ToDataR

26、ow(DataRow dataRow);/獲取焦點記錄索引int index = this.MainView.FocusedIndex;/獲取焦點記錄IUIRecord record = this.MainView.FocusedRecord;/設(shè)置焦點記錄this.MainView.FocusedRecord = record;/獲取被選擇的記錄集合IUIRecordCollection records = this.MainView.SelectRecords;操作UIModelUIView與Record的處理:/獲取設(shè)置焦點字段this.MainView.FocusedRecord;支持

27、get、set/設(shè)置記錄刪除標志UIRecord.Delete();/移出記錄UIRecord.Remove();/記錄復(fù)制到UIRecordUIRecord.CopyTo(IUIRecord);/UIRecord與EntityData復(fù)制UIRecord.FromEntityData(object entityData);UIRecord.WriteToEntityData(object entityData);/UIRecord與DataRow復(fù)制UIRecord.FromDataRow(DataRow dataRow);UIRecord.ToDataRow(DataRow dataRow

28、);/判斷該記錄是否為焦點、被選擇的記錄UIRecord.IsFocused;UIRecord.IsSelected;加載UIModel修改視圖中的過濾條件直接修改Opath語句修改條件語句值,增加Order By ,Group By語句修改過濾條件中的參數(shù)UIForm編程UI控件容器控件Label控件文本框控件(含數(shù)字控件)日期控件參照控件彈性域控件枚舉控件(含動態(tài)枚舉)關(guān)聯(lián)控件向?qū)Э丶?shù)據(jù)綁定控件的查找方法IPart接口中的查找控件的方法定義如下:/ 通過名稱得到抽象容器IUIViewBindingControl GetContainerByName(string name);/ 通過UI

29、View名稱得到其綁定的容器控件IUIViewBindingControl GetViewContainerByUIViewName(string viewName);/ 通過UIView綁定的容器,和UIField的名字,查找綁定UIField的控件IUIFieldBindingControl GetUIFieldBindingControl(IUIViewBindingControl viewContainer, string fieldName);/ 在指定容器中查找控件IUFControl GetUFControlByName(IContainer container, string

30、name);(1)在ActionExtend中通過IPart的接口在指定容器中查找控件(2)查找到指定控件后,然后修改屬性即可。通用的CRUD的Action可以在Action中調(diào)用通用CRUD Action,不過目前都是在Action模板寫好了通用CRUD Action調(diào)用,除非有特殊需求,否則還是使用現(xiàn)成的通用CRUD Action調(diào)用模板;在狀態(tài)條中顯示信息做法:在UFSoft.UBF.UI.Engine.Runtime.dll位于UFSoft.UBF.UI.Engine命名空間的UIEngineHelper類下有靜態(tài)方法: / / 在客戶端的狀態(tài)欄中顯示指定的信息 / / 用戶控件頁面

31、/ 在客戶端狀態(tài)欄中要顯示的信息 public static void ShowWindowStatus(IPart form, string message)示例:在ActionExtend中,需要引用UFSoft.UBF.UI.Engine.Runtime.dll,代碼如下:UIEngineHelper.ShowWindowStatus(this.CurrentPart, Resourse);Resourse代表資源信息;在ActionExtend中調(diào)用專用BP Agent做法:在ActionExtend所在的項目中引用BPAgent的dll請注意,按照我們的架構(gòu)設(shè)計,在ActionExt

32、end只能訪問BPAgent示例:在ActionExtend所在的項目中引用BPAgent的dl增加命名空間的引用,如using UFSoft.UBF.Alert.Proxy;寫調(diào)用BP Agent的代碼,如下StartAlertBPProxy bp = new StartAlertBPProxy();bp.AlertKey =。bp.Do();狀態(tài)編程在Action的基類中有接口:/取當前的State.public UIState CurrentState get; 在ActionExtend中可以訪問CurrentState,并可以給CurrentState賦值和取值示例:比如說Form1

33、彈出Form2,如果傳遞比較大的數(shù)據(jù)時,如傳Form1把自己的整個UIModel傳遞給Form2,可以使用CurrentState進行傳遞,做法如下:在Form1彈出Form2的ActionExtend中,給CurrentState賦值:this.CurrentStateMyUIModel = this.CurrentModel;在Form2的某個ActionExtend中取出傳遞的UIModel:IUIModel uiModel=this.CurrentStateMyUIModel;if(uiModel !=null) 這種方式最后要自己手工清除掉緩存的數(shù)據(jù),比較麻煩。推薦的做法:在UIMo

34、del中添加一個屬性,來緩存,系統(tǒng)會在適當?shù)臅r機自動清除緩存。彈出Form彈出的對話框頁面和被彈出的頁面共享UIModel比如說Form1彈出Form2,F(xiàn)orm1和Form2共享UIModel,只要在Form1中調(diào)用如下代碼就能彈出Form2,并且把Form1當前的UIModel傳過去,假如在ActionExtend中寫:this.CurrentPart.ShowModalDialog(PartID, Form2, 400, 500, this.CurrentPart.TaskId.ToString();彈出的對話框頁面和被彈出的頁面不共享UIModel比如說Form1彈出Form2,F(xiàn)or

35、m1和Form2不共享UIModel,只要在Form1中調(diào)用如下代碼就能彈出Form2,F(xiàn)orm2自會加載自己的UIModel,假如在ActionExtend中寫:this.CurrentPart.ShowModalDialog(PartID, Form2, 400, 500, null);頁面導(dǎo)航(非封裝模式)導(dǎo)航頁面和被導(dǎo)航頁面共享UIModel比如說Page1導(dǎo)航到Page2,Page1和Page2共享UIModel,只要在Page1中調(diào)用如下代碼就能導(dǎo)航Page2,并且把Page1當前的UIModel傳過去,假如在ActionExtend中寫:NameValueCollection q

36、uery = new NameValueCollection();query.Add(ParentTaskID, this.CurrentPart.TaskId.ToString();this.CurrentPart.Navigate(PageURI, query);導(dǎo)航頁面和被導(dǎo)航頁面不共享UIModel比如說Page1導(dǎo)航到Page2,Page1和Page2不共享UIModel,只要在Page1中調(diào)用如下代碼就能導(dǎo)航Page2,并且Page1自會加載自己的UIModel去,假如在ActionExtend中寫:this.CurrentPart.Navigate(PageURI, null);

37、頁面導(dǎo)航(封裝模式)使用UFIDA.U9.UI.PDHelper.NavigateManager類完成Form的彈出和頁面切換導(dǎo)航與非封裝的方式類似,省去了不必要的參數(shù)設(shè)置,如:NavigateManager.NavigatePage(IPart part, string pageId),NavigateManager.NavigatePage(IPart part, string pageId , NaviteParamter param) 課程概述 后臺組件編程基礎(chǔ) 前臺組件編程基礎(chǔ) 專題研究主題 弱類型實體 異常擴展、異常綁定 實體緩存 直接運行SQL和存儲過程 實體鎖 系統(tǒng)日志 實體擴

38、展字段 CallBack函數(shù)調(diào)用專題目錄 弱類型實體 異常擴展、異常綁定 實體緩存 直接運行SQL和存儲過程 實體鎖 系統(tǒng)日志 實體擴展字段 CallBack函數(shù)調(diào)用專題目錄弱類型實體弱類型實體新建/ / 根據(jù)名稱建實體 / Test public void TestCrtEntity() using (ISession s = Session.Open() string fullname = UFIDA.U9.CBO.SCM.Customer.Customer; /新建 Entity entity = Entity.Create(fullname, null); entity.SetValu

39、e(Name, 1234567); /提交 mit(); 弱類型實體弱類型實體刪除/ / 根據(jù)名稱刪除實體 / Test public void TestDelEntity() using (ISession s = Session.Open() string fullname = UFIDA.U9.CBO.SCM.Customer.Customer; /查詢 EntityQuery query = new EntityQuery(fullname); Entity entity = query. FindByID (long)111); /刪除 s.Remove(entity); /提交 m

40、it(); 弱類型實體弱類型實體查詢修改/ /查詢 / Test public void FindAndMod() using (ISession s = Session.Open() string fullname = UFIDA.U9.CBO.SCM.Customer.Customer; /查詢 EntityQuery query = new EntityQuery(fullname); Entity entity = query. FindByID (long)111); /修改 entity.SetValue(Name, forTest); s.Modify(entity); /提交

41、mit(); 弱類型實體 異常擴展、異常綁定 實體緩存 直接運行SQL和存儲過程 實體鎖 系統(tǒng)日志 實體擴展字段 CallBack函數(shù)調(diào)用專題目錄異常信息的擴展在一些特殊的業(yè)務(wù)情況下,可能不夠詳細,如果需要擴展平臺的異常信息,可以在實體的Extend的文件中,重載基類方法DealException(Exception e),然后捕獲自己期待的異常,封裝為規(guī)范的異常顯示示例:public override void DealException(Exception e)if (e is RefObjectInValidException)RefObjectInValidException re =

42、 (RefObjectInValidException)e; throw new ApplicationExceptionBase(實體“+re.EntityFullName +的屬性 + re.AttrName + 引用對象不合法 ,值為 + this.Valuesre.AttrName + ); base.DealException(e);異常綁定 業(yè)務(wù)異常綁定到實體需要給異常賦值 EntityID 和EntityFullName,如: XXXException.EntityID = EntityInstanceID; XXXException.EntityFullName = Entit

43、yFullName; 業(yè)務(wù)異常綁定到屬性需要給異常賦EntityID,EntityFullName,AttributeName,如: XXXException.EntityID = EntityInstanceID; XXXException.EntityFullName = EntityFullNameXXXException.AttributeName = AttributeName 弱類型實體 異常擴展、異常綁定 實體緩存 直接運行SQL和存儲過程 實體鎖 系統(tǒng)日志 實體擴展字段 CallBack函數(shù)調(diào)用專題目錄實體緩存實體緩存簡介為提高性能,避免頻繁的訪問數(shù)據(jù)庫,后臺引擎提供了實體緩存

44、的機制典型的特殊場景開發(fā)在服務(wù)中嵌入部分存儲過程以致修改了實體的數(shù)據(jù),而這個數(shù)據(jù)在該服務(wù)的后續(xù)場景還要訪問到被存儲過程更新的新值,這是很特殊的情況,需要將2層緩存的數(shù)據(jù)全部清除,強制下次訪問直接從數(shù)據(jù)庫加載新值。實體緩存清除緩存中的實體可以通過下面的方式訪問2層緩存,引用UFSoft.UBF.PL.dll:線程級數(shù)據(jù)緩存是:UFSoft.UBF.PL.Tool.ConfigParm.EntityCache;服務(wù)級引用緩存是:UFSoft.UBF.PL.Engine.StateManager.EntityStateCache;兩者返回的對象都是ICache類型,ICache有下面2個對外方法可以

45、清除緩存: / / 從Cache中刪除指定的對象 / / void Remove(object key);/ / 清除所有的Cache內(nèi)容/ void Flush();注意1、 清緩存時這2級緩存都要清除。2、 void Remove(object key),參數(shù)key是實體的EntityKey 弱類型實體 異常擴展、異常綁定 實體緩存 直接運行SQL和存儲過程 實體鎖 系統(tǒng)日志 實體擴展字段 CallBack函數(shù)調(diào)用專題目錄直接運行SQL和存儲過程引用UFSoft.UBF.Util.DataAccess.dllDataAccessor類方法RunSQL:直接運行SQL方法RunSP:直接運行

46、存儲過程示例( RunSQL )StringBuilder ExecuteSql = new StringBuilder(256); ExecuteSql.Append( DECLARE StartSN bigint ; ); ExecuteSql.Append( DECLARE EmpCount int ; );ExecuteSql.Append( Set EmpCount= + this.EmpPayrolls.Count * 10 + ;); ExecuteSql.Append( EXEC dbo.AllocSerials EmpCount OUTPUT, StartSN OUTPUT

47、;); ExecuteSql.Append(InsertSql.ToString();/其它Insert語句 ExecuteSql.Append(UpdatePayrollDocSQL.ToString();/其他Update語句 ExecuteSql.Append(UpdatePayrollSupplySQL.ToString(); /進行提交SQL DataAccessor.RunSQL(UFSoft.UBF.Sys.Database.DatabaseManager.GetCurrentConnection(), ExecuteSql.ToString(), new DataParamLi

48、st(), true);直接運行SQL和存儲過程示例(RunSP)DataParamList lst; lst = new DataParamList(); lst.Add(DataParamFactory.CreateInput(PayrollDoc, this.ID.ToString(), System.Data.DbType.StringFixedLength); lst.Add(DataParamFactory.CreateInput(PayrollCalculate, this.PayrollCaculate.ID.ToString(), System.Data.DbType.Str

49、ingFixedLength); DataAccessor.RunSP(DatabaseManager.GetCurrentConnection(), PA_ReWritepayrollresult, lst); 弱類型實體 異常擴展、異常綁定 實體緩存 直接運行SQL和存儲過程 實體鎖 系統(tǒng)日志 實體擴展字段 CallBack函數(shù)調(diào)用專題目錄實體鎖離線悲觀鎖加鎖操作(讀鎖、寫鎖)解鎖操作查詢某個實體當前的鎖狀態(tài)查詢某個用戶當前的加鎖信息實體鎖的使用引用UFSoft.UBF.Business.dll主要接口UFSoft.UBF.Business.Lock.EntityLockManager提供

50、實體的加鎖、解鎖、以及查詢接口API。LockForWrite(entity.Key)/加寫鎖LockForRead(entity.Key)/加讀鎖Unlock(eLock)/解鎖QueryLockOwners(entity.Key)/查詢特定實體的加鎖信息QueryLocks()/查詢當前用戶的加鎖信息實體鎖的使用使用樣例using (ISession session = Session.Open()/獲得實體entity/對實體entity加寫鎖EntityLock eLock = EntityLockManager.LockForWrite(entity.Key);if(eLock!=n

51、ull)/如果加鎖成功 mit(); EntityLockManager.Unlock(eLock);/ 對實體entity解鎖 加鎖操作與解鎖操作一定要成對的進行。或者使用using語句。 弱類型實體 異常擴展、異常綁定 實體緩存 直接運行SQL和存儲過程 實體鎖 系統(tǒng)日志 UI界面調(diào)整 實體擴展字段 CallBack函數(shù)調(diào)用專題目錄系統(tǒng)日志的配置說明配置路徑PortaUBFConfigUFIDA.UBF.Log.ConfigUBF的Log目前UBF的LOG 是UBF自身定義的一套LOG接口,但其實現(xiàn)是基于LOG4NET的框架上包裝而成,所以,目前基本配置及用法,和LOG4NET是一樣的。L

52、og輸出類型LOG輸出類型共有5種:從級別低到高依次為 Debug輸出調(diào)試信息 Info輸出提示信息 Warn輸出警告信息 Error輸出錯誤信息 Fatal輸出嚴重錯誤信息配置文件中如果配置的為Info,那Info及Info以上級別的都會輸出系統(tǒng)日志的使用添加代碼使用舉例:ILogger logger = LoggerManager.GetLogger(typeof(OrderDoc);if (logger.IsInfoEnabled)logger.Info(“Info級別的信息”);if (logger.IsDebugEnabled)logger.Debug(“Debug級別的信息”) ;

53、使用Is*Enabled的方式主要用于,當logger的信息是經(jīng)過運算或者有一定的處理消耗,那可以用該判斷來避免不輸出Log時,該些方法的無謂的消耗。 弱類型實體 異常擴展、異常綁定 實體緩存 直接運行SQL和存儲過程 實體鎖 系統(tǒng)日志 實體擴展字段 CallBack函數(shù)調(diào)用專題目錄實體擴展字段又稱為描述性彈性域描述性彈性域包含30個公共擴展字段(全局段)和30個實體私有擴展字段(全局段和上下文相關(guān)段)實現(xiàn):后臺:添加“實體擴展字段”前臺:卡片處理Grid處理描述性彈性域卡片處理1)、拖一個彈性域控件,并設(shè)置其類型為Description。2)、在AfterCreateChildControls()里面

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論