把服务器上的一个数据库里的一个表下载到本地数据库对应表中.
我现在的写法是:
qyServer.active := false;
qyServer.sql.text := 'select XX,XX,xx from tbl_xxxx ';
qyServer.active := true;
while not qyServer.eof do 
begin
  qyLocal.sql.text := 'insert into tbl_xxx valuse('''+qyServer.fieldByName  ('xxx').asString+''','''+...+'''...)';
 qyLocal.ExecSQL;
  qyServer.next;
end;
  
这样子做的话,资料量在1000条以下时候还可以接受的,但资料量一大就感觉很慢
问高手有没有办法解决这个问题,我相信一定有好的办法.
在线等.

解决方案 »

  1.   

    用存储过程写,
    把你要执行的sql写到存储过程然后执行就好了.
    存储过程可以跨库访问.
      

  2.   

    照你的要求,直接在存储过程写
    select * into table_local from table_server
      

  3.   

    服务器数据库是MYSQL 没有存储过程的呀.有没有其它办法呢?
      

  4.   

    直接用上面的select into 这种方式,
    在delphi中用query调用
      

  5.   

    这里是二个Query呀,如何调用呢?
      

  6.   

    并且在你这段代码开始加query.disablecontrols
    结束后用query.enablecontrol
    ,还有最好不要用Dbgrid这样的组件在那里刷新,刷新很占用资源
      

  7.   

    My Sql偶真不清楚,但导入导出这样的功能应该是有的,为什么不直接用呢?
      

  8.   

    客户端用的是Access 数据库.所以不好用导入导出的功能呀.
    谢谢你先
      

  9.   

    这样一条条地加,肯定是慢的.
    就算用了disablecontrol也是这样。
      

  10.   

    客户端用的是Access 数据库.所以不好用导入导出的功能呀.
    谢谢你先
    用sql的dts导入吧,Access也没有问题.
      

  11.   

    不管你下没有下线
    我觉得你可以使用
    insert Tab1 select tab2
    批插入,这样速度会很快的``
      

  12.   

    SQL可以直接导出到ACCESS的啊!你看看。
      

  13.   

    请看一下SQL SERVER中的OPENROWSET用法,用SQL语句应该直接搞定!
      

  14.   

    andy1126(我是猪,我很乖!) :
    二个Query二个库怎么用 insert table1 select table2 呀!
      

  15.   

    ==========================================事務處理插入===================================
    procedure TForm1.suiButton1Click(Sender: TObject);//调用程序
    var
      tempvar:string;
    begin
      tempvar:='aaaaaaaa';
      sqlexec('insert into tbl_xxx valuse('''+qyServer.fieldByName  ('xxx').asString+''','''+...+'''...)');
    end;//sqlexec的函数
    procedure sqlexec(sqlcommstring:string); //插入、更新、删除等SQL操作
    begin
    with dataSetAll do
      begin
        ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
        adoconn.Close;
        adoconn.Open;
        adoconn.BeginTrans; //开始事务处理
        try
          ADOQuery1.SQL.Add(sqlcommstring);
          ADOQuery1.ExecSQL;
          adoconn.CommitTrans;//提交事务处理
        except
          adoconn.RollBackTrans;//回滚事务处理
        end;
      end;
      

  16.   

    或者 直接文件读写 不用ACCESS  用DBF
      

  17.   

    建议你看看 SQL SERVER 帮助 OPENDATASOURCESELECT   *
    FROM      OPENDATASOURCE(
             'SQLOLEDB',
             'Data Source=ServerName;User ID=MyUID;Password=MyPass'
             ).Northwind.dbo.Categories
      

  18.   

    先查询所要的数据到一个qyServer中,再从qyServer传给qyACCESS(ACCESS表)..
      

  19.   

    需在本机数据库中运行:
    --本机的Access文件
    insert into 
    OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
       'd:\mzzd.mdb';'admin';'', mzsf_hslb) 
    (cwlb, cwlm, hslb, hslm)
    --服务器Myserver中的XSDATA数据库
    SELECT a.cwlb, a.cwlm, a.hslb, a.hslm
    FROM OPENROWSET('SQLOLEDB','Myserver';'sa';'mypass',
       'SELECT * FROM XSDATA.dbo.Table1 ') AS a上面的脚本 本人已测试通过!
      

  20.   

    我SERVER端用的是MYSQL 不是Ms SQLServer 连接方式用的是ODBC 这样如何解决呢?
      

  21.   

    用什么MYSQL,不好用,没有存储过程的差太远啦
    如果只能在前台操作,那肯定是慢的,你就不要想怎么优化了,
    如果用SQL SERVER,则很灵活,全部在后台完成,时间用的也很少
      

  22.   

    另外我做了个Delphi的函数,用SQL脚本的,可惜电脑不在这里,要不帮你贴在这里了。
    [email protected]
      

  23.   

    到下面去看看呀,希望对你有帮助了
    http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
      

  24.   

    试试把 qyLocal 改成 ADOCommand
      

  25.   

    上面写错了, 是改为直接用 ADOConnection 执行插入