Midas如何把TableName包入Data和Delta |
|
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
当你在Com+的资料元件写
procedure TData.SaveData(Delta: OLEVariant); var EC:integer; begin try SQLQuery_Data.Close; SQLQuery_Data.SQL.Clear; DataSetProvider_Data.ApplyUpdates(Delta,-1,EC); if EC<>0 then begin SetAbort; Raise UpdateError; end else SetComplete; except SetAbort; raise; end; end;来保存客户端TClientDataSet送来的异动资料时,你可能会发现资料保存不进去,报“灾难性故障”,如果在TDataSetProvider的OnUpdateError事件写代码: procedure TData.DataSetProvider_DataUpdateError(Sender: TObject; DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind; var Response: TResolverResponse); begin UpdateError:=E; ShowMessage(E.Message); Response:=rrAbort; end;你会看到如下错误消息: unable to resole records.Table name not found. 意思是delta里没有TableName信息,Data里也没有,TDataSetProvider不知道如何产生更新的SQL语句。 需要让Client同时以参数形式把TableName传过来吗?SaveData变成 procedure SaveData(TableName:WideString;Delta:OLEVariant);virtual;safecall; 太麻烦了吧?有办法在返回TDataSetProvider.Data时就把TableName信息写入Data呢?而且Delta也能带回? 我们看看TDataSetProvider的OnGetDataSetProperties事件,好像可以夹杂点自己的东西到Data里,如何让它认识这是TableName信息呢?看看Provider.pas的TSQLResolver的: procedure TSQLResolver.InitTreeData(Tree: TUpdateTree); override; .... begin if Tree.Data <> nil then Dispose(PSQLInfo(Tree.Data)); New(Info); Tree.Data := Info; Info.IsSQLBased := IProviderSupport(Tree.Source).PSIsSQLBased; Info.QuoteChar := IProviderSupport(Tree.Source).PSGetQuoteChar; TableName := VarToStr(Tree.Delta.GetOptionalParam(szTABLE_NAME)); if TableName = '' then TableName := IProviderSupport(Tree.Source).PSGetTableName; Provider.DoGetTableName(Tree.Source, TableName); ......哦,要用szTABLE_NAME,如何夹入到Param里呢?格式如何? 再看看 procedure TDataSetProvider.DoGetProviderAttributes(DataSet: TDataSet; List: TList); var CustParams: OleVariant; Attr: PPacketAttribute; i, j: Integer; begin IProviderSupport(DataSet).PSGetAttributes(List); if Assigned(FGetDSProps) then begin FGetDSProps(Self, DataSet, CustParams); if VarIsArray(CustParams) then begin for i := VarArrayLowBound(CustParams, 1) to VarArrayHighBound(CustParams, 1) do begin if VarIsArray(CustParams[i]) and (VarArrayHighBound(CustParams[i], 1) - VarArrayLowBound(CustParams[i], 1) = 2) then begin j := VarArrayLowBound(CustParams[i], 1); New(Attr); List.Add(Attr); with Attr^ do begin Name := CustParams[i][j]; Value := CustParams[i][j + 1]; IncludeInDelta := CustParams[i][j + 2]; end; end; end; end; end; end;哦,三个字段,第一Name,第二个Value,第三个是否包含在Delta里,ok,干吧 procedure TData.DataSetProvider_DataGetDataSetProperties(Sender: TObject; DataSet: TDataSet; out Properties: OleVariant); var V:OLEVariant; begin Properties:=VarArrayCreate([0,0],varVariant); V:=VarArrayCreate([0,2],varVariant); V[0]:=szTABLE_NAME; V[1]:=GetTableNameFromQuery(TSQLQuery(DataSet).SQL.Text); V[2]:=true; Properties[0]:=V; end;GetTableNameFromQuery函数在DBCommon.pas 我用的dbexpress,因此用TSQLQuery(DataSet),具体看你了。 ok,可以了吧? ------------------------------- 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2003/11/18 16:01:30
------
江上何人初见月,江月何年初照人 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |