全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2138
推到 Plurk!
推到 Facebook!

Midas如何把TableName包入Data和Delta

 
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-18 13:36:59 IP:218.1.xxx.xxx 未訂閱
当你在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
------
江上何人初见月,江月何年初照人
系統時間:2024-07-04 3:52:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!