客户端用ACCESS,服务器用SQL Server。客户端需要时常更新数据库,即从远程服务器端下载几个新的数据库表到本地ACCESS(将旧表删除)。
    客户端用的组件为SocketConnection、ClientDataSet。
    如何有效地进行数据库的更新?

解决方案 »

  1.   

    没人回答?
    我用下面的方法从服务器端导入access一个表,结果告诉我ODBC--调用失败
    ADOConnection1.Execute('SELECT * into CheckRule from a in [ODBC][ODBC; Driver = SQL Server;UID = sa;PWD =;Server = 192.168.0.45; DataBase = SBXT; ]');
      

  2.   

    简单的办法就是客户端程序启动的时候,在启动画面的时候表示开始更新数据库
    把服务器端要更新过来的表记录保存为文件发送到客户端,客户端先删除old记录,然后load文件,再保存
      

  3.   

    你服务器端的要导过来的表用query打开,可以savetofile的,
    传到客户端的时候,等删除了原来表里面的数据后,再用loadfromfile出数据,然后保存起来不行吗
      

  4.   

    或者在服务器端根据数据就直接导出的文件为insert into table..  values...这样的语句为文本文件,客户端接收后直接将该文件内容放到query的sql里面,执行就可以了
      

  5.   

    没成功是指哪一块没成功????大概写一下吧,不过没有在delphi环境中试,参考吧
    方法一: (直接构建SQL ,到客户端执行即可)
    server :
    var  ss : string;  stringlist :Tstringlist;adoquery.close;
    adoquery.sql.text := 'select *From table'; //你要同步的表
    adoquery.open;
    if adoquery.recordcount > 0 then
    begin
      stringlist := TStringlist.create;
      try
        adoquery.first;
        while not adoquery.eof do
        begin
          ss := 'insert into table(...) values('+ adoquery.fieldbyname('...').asstring  +...全部字段 +') ';
          stringlist.add(ss);
          adoquery.next;
        end;    stringlist.savetofile('aaa.txt');  //存为aaa.txt文本文件,压缩随你
        //  然后在将该文件传到客户端,用stringlist.loadfromfile出来   
       //客户端用一个adoquery.sql.text := stringlist.text,然后adoquery.execsql就将所有数据保存起来了
      finally
        stringlist.free;
      end;
    end;方法二:
    直接在服务器端
    adoquery.close;
    adoquery.sql.text := 'select *From table';
    adoquery.open;
    adoquery.savetofile(...)     //不记得该控件是否有savetofile和loadfromfile方法,好像adodataset有这个功能,自己看,用有这个功能的
    传到客户端后,客户端用adoquery.loadfromfile 
    然后再用一个adoquery来查询客户端的表,用过上面的这个循环给下面的这个插入即可
      

  6.   

    有没有方法直接连接远程服务器端的SQL Server数据库,然后将表导入到本地ACCESS?
    因为我要导入好几个表,而且有些表和表的字段都是不确定的
      

  7.   

    ADOConnection1.Execute('SELECT * into CheckRule from a in [ODBC][ODBC; Driver = SQL Server;UID = sa;PWD =;Server = 192.168.0.45; DataBase = SBXT; ]');
    我现在是想用类似上面的语句一句搞定的,不想用手动建表的方法.实在不行才用那样的办法.
    没答案只能这样了
      

  8.   

    遇到Image类型的字段该怎么做?其他类型的已经解决
      

  9.   

    text类型用备注类型字段
    image的话,转换为流(可通过内存流转换为字符流),字符流有个datastring属性(大概,记不清了),字段还是用备注类型,存下datastring(是字符串),到时候再反过来显示(没试过,不知道行不行)
      

  10.   

    你回答问题前先试试好不好?这样转换成datastring还是乱码,没起到作用。
      

  11.   

    唉,你想想好吧,是image类型的,你转换成乱码保存在数据库怎么不行?? 乱码和你有什么关系????
    你读取的时候只要不是用dbimage控件,而是再用流读取并转换就可以了,又不是让用户直接看这个数据库里面的记录,再说你看SQL SERVER,你在查询分析器中用sql语句查询难道能显示图片?? 只不过dbimage控件自己转换了而已
      

  12.   

    在查询分析器中用select语句的时候Image显示的是一串16进制数,并非乱码。而且乱码的化生成的Insert语句在客户端运行报错。
      

  13.   

    uses encddecdtype
      TForm1 = class(TForm)
        Button1: TButton;
        Image1: TImage;
        Memo1: TMemo;
        Button2: TButton;
        Button3: TButton;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
    begin
      close;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      ss : String;
      MeoStream : TMemoryStream;
      strStream : TStringStream;
    begin
      MeoStream := TMemoryStream.Create;
      strStream := TStringStream.Create('');
      try
       // Image1.Picture.Bitmap.SaveToStream(MeoStream);
        MeoStream.LoadFromFile('E:\Working\ico\res\系统设置.bmp');
        MeoStream.SaveToStream(strStream);
        Memo1.Text := EncodeString(strStream.DataString);
      finally
        MeoStream.Free;
        strStream.Free;
      end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
      strstream : TStringStream;
    begin
      strstream := TStringStream.Create(DecodeString(Memo1.Text));
      try
        Image1.Picture.Bitmap.LoadFromStream(strstream);
      finally
        strstream.Free;
      end;end;
    测试通过
      

  14.   

    uses encddecd使用encodestring()再保存到数据库
    因为乱码里面有' ',容易出现问题,所以使用的时候再decodestring()
      

  15.   

    问题是用了decodestring,insert语句还是没法运行。
    你就告诉我Image类型的字段该怎么用Insert语句插入,.我要在服务器端生成Insert语句,然后客户端运行.
      

  16.   

    我以前是用TSocketConnetion
    客户端不传Sql语句了
    直接调用中间层COM+方法
    传入Ole变体参数,执行成功后或得数据集
    直接赋给ClientDataSet.date,
    那么就可以直接当数据集遍历了。
      

  17.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      ss : String;
      MeoStream : TMemoryStream;
      strStream : TStringStream;
    begin
      MeoStream := TMemoryStream.Create;
      strStream := TStringStream.Create('');
      try
        MeoStream.LoadFromFile('E:\Working\ico\res\系统设置.bmp');
        MeoStream.SaveToStream(strStream);
        Memo1.Text := EncodeString(strStream.DataString);    sql := 'insert into tables(fName,fImage) values('+QuotedStr('aaa')+','+QuotedStr(memo1.Text)+')';
        memo2.Text := sql;
      finally
        MeoStream.Free;
        strStream.Free;
      end;
    end;procedure TForm1.btnCloseClick(Sender: TObject);
    begin
      Close;
    end;procedure TForm1.btnsaveClick(Sender: TObject);
    begin
      if trim(sql) <> '' then
      begin
        qryMain.Close;
        qryMain.SQL.Text := sql;
        qryMain.ExecSQL;
        showmessage('OK');
      end;
    end;
    测试,可以保存
      

  18.   

    终于解决了,谢谢,我有个地方写错了.
    以后得多向你学习了,我接触Delphi不是太长.