用了五个控件
1. HOST: TADOConnection
2. ADO: TADOQuery
3. DSP: TDataSetProvider
4. CDS: TClientDataSet
5. DS: TDataSource
6  DBGrid1: DBGrid;ADO.Connection := HOST;
DSP.DataSet := ADO;
CDS.ProviderName := DSP;
DS.DataSet := CDS;
DBGrid1.DataSource := DS;为什么我用CDS.ApplyUpdates(0);不能把已修改的数据提交到服务器呢?
我主要是想通过三层的方法更新数据,请各位大哥大姐指点下

解决方案 »

  1.   

    你是做三层架构的,那你的服务端是怎么写的?你这里只是写了客户端的处理,TClientDataSet与服务端对应处理。再说你是用的Dcom还是Socket你好像哪 个也没有用!!
      

  2.   

    以前使用过的数据库操作类,你看看里面的UpdateDataSet方法,参数
    SQLCommand:string;         --获得表结果
    TableName:String;          --更新的表名
    DataSet:TClientDataSet;    --需要更新的dataset
    NotUpField:Array of string --不更新的字段名
    调用
    updatedataset('select * from tablename where 1=2','tablename',yourclientdataset,[]);
    你看看是怎么实现的吧,要想直接用这个类,你简单修改一下也可以
    unit IClsDBAccessADO;interfaceuses
      SysUtils, Classes, ADODB, Provider, DB, DBClient,Dialogs,Tool_N,IniFiles,IBase,MIDASLIB;
    type
      TDBAccessADO = class (TDataModule, IDBAccess)
        ADOCommand1: TADOCommand;
        ADOConnection1: TADOConnection;
        ADODataSet1: TADODataSet;
        ClientDataSet1: TClientDataSet;
        DataSetProvider1: TDataSetProvider;
        procedure DataModuleCreate(Sender: TObject);
        procedure DataModuleDestroy(Sender: TObject);
        procedure DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS:
                TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
                var Applied: Boolean);
      private
        FNotUpdateField: array of string;
        SqlPwd,SqlUserName,SqlDBName,ServerIp:string;
        //设置连接
        procedure SetConnectStr;
      public
        Function InitServer:integer;
        function ExecSQLCommand(SQLCommand:string): Integer; stdcall;
        function GetDataSet(SQLCommand:string;DataSet:TClientDataSet): Integer; 
                stdcall;
        function UpdateDataSet(SQLCommand:string;TableName:String; 
                DataSet:TClientDataSet;NotUpField:Array of string): Integer; 
                stdcall;
      end;
      
    var
      DBAccessADO: TDBAccessADO;implementationuses FrmDialog;//uses SystemConst;{$R *.dfm}{ TDataModuleDBConMgr }{
    ********************************* TDBAccessADO *********************************
    }procedure TDBAccessADO.DataModuleCreate(Sender: TObject);
    var
      s: string;
    begin
      s:='数据库连接失败!';
      if InitServer=S_False then exit;
    end;procedure TDBAccessADO.DataModuleDestroy(Sender: TObject);
    begin
      ADOConnection1.Connected:=False;
    end;procedure TDBAccessADO.DataSetProvider1BeforeUpdateRecord(Sender: TObject;
            SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind:
            TUpdateKind; var Applied: Boolean);
    var
      int1: Integer;
      Field1: TField;
    begin
      if Length(FNotUpdateField)=0 then Exit;
      for int1:=Low(FNotUpdateField) to High (FNotUpdateField) do
      begin
        Field1:=DeltaDS.FieldByName(FNotUpdateField[int1]);
        Field1.ProviderFlags:=
          Field1.ProviderFlags-[pfInUpdate,pfInWhere];
      end;
    end;function TDBAccessADO.ExecSQLCommand(SQLCommand:string): Integer;
    begin
      adocommand1.CommandText:=SqlCommand;
      try
        adoconnection1.Connected:=false;
        adoconnection1.Connected:=true;
        adocommand1.Execute;
        adoconnection1.Connected:=false;
        result:=S_OK;
      except
        result:=S_False;
      end;
    end;function TDBAccessADO.GetDataSet(SQLCommand:string;DataSet:TClientDataSet):
            Integer;
    begin
      try
        adoconnection1.Connected:=false;
        adoconnection1.Connected:=true;
        clientdataset1.Active:=false;
        clientdataset1.CommandText:=SQLCommand;
        clientdataset1.Active:=true;
        DataSet.Data:=ClientDataSet1.Data;
        clientdataset1.Active:=false;
        result:=S_OK;
      except
        result:=S_False;
      end;
    end;function TDBAccessADO.InitServer: Integer;
    //var
    //  SQLPwd, SQLUserName, SQLDBName, ServerIP: string;  procedure InitSqlParam;
      var
        FileName:string;
      begin
        FileName:=GetMainPath+'resource\ServerList.ini';
        with TInifile.Create(Filename) do
        begin
          ServerIP:=ReadString('ServerInfo','ServerIP','');
          SQLDBName:=ReadString('ServerInfo','SQLDBName','');
          SQLUserName:=ReadString('ServerInfo','SQLUserID','');
          SQLPwd:=ReadString('ServerInfo','SQLPwd','');
          Destroy;
        end;
      end;begin
      InitSqlParam;  ADOConnection1.Connected:=False;
      ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password='+
        SQLPwd+
        ';Persist Security Info=True;'+
        'User ID='+
        SQLUserName+
        ';Initial Catalog='+
        SQLDBName+
        ';Data Source='+
        ServerIP;
      try
        ADOConnection1.Connected:=True;
        result:=S_OK;
      except
        result:=S_FALSE;
      end;end;procedure TDBAccessADO.SetConnectStr;
    var
      ConnStr:string;
    begin
      Connstr:='Provider=SQLOLEDB.1;Integrated Security=SSPI;'+
        'Persist Security Info=False;Data Source='+ServerIp;
      adoconnection1.Connected:=false;
      adoconnection1.ConnectionString:=ConnStr;
    end;function TDBAccessADO.UpdateDataSet(SQLCommand:string;TableName:String;
            DataSet:TClientDataSet;NotUpField:Array of string): Integer;
    var
      ErrorCount:integer;
      int1,int2:integer;
    begin
      if DataSet=nil then
      begin
        result:=S_False;
        exit;
      end;
      if DataSet.ChangeCount=0 then
      begin
        result:=0;
        exit;
      end;
      try
        adoconnection1.Connected:=false;
        adoconnection1.Connected:=true;
      except
        result:=S_False;
        exit;
      end;  //FNotUpdateField
      int1:=length(NotUpField);
      if int1<>0 then
      begin
        setlength(FNotUpDateField,int1);
        int2:=0;
        for int1:=low(NotUpField) to high(notUpField) do
        begin
          FNotUpdateField[int2]:=NotUpField[int1];
          inc(int2);
        end;
      end;  try
        adodataset1.CommandText:=SQLCommand;
        clientDataset1.Data:=dataset.Delta;
        DataSetProvider1.ApplyUpdates(clientdataset1.Data,0,errorcount);
        if errorcount=0 then
          dataset.MergeChangeLog;
        result:=errorcount;
      except
        result:=S_False;
      end;
    end;end.数据库配置文件ini内容
    [ServerInfo]
    ServerIP=127.0.0.1
    SQLDBName=dngr
    SQLUserID=sa
    SQLPwd=sa
      

  3.   

    有三层代码的实例吗?我是用delphi 6/7的,如果可以的话,请发到我 邮箱里 [email protected]
    不胜感激,这里的分不够,我重开再加