我用ADOQuery从远程数据库中查询出2000条数据或者更多,想将其插入到本地ACCESS数据库的一个表中,怎样能让插入效率最高?别告诉我一条一条的插入,即使用ADO的事务也很慢。  另外,如果在插入数据时表中已有相同记录,如何能避免再次插入?别告诉我用主键报错的方式来判断,因为那样效率太低。请高手最好写出代码,万分感谢!

解决方案 »

  1.   

    sql和access互导网上有N多,其中之一
    http://w3china.org/blog/more.asp?name=angelblog&id=13165
      

  2.   

    回答第二个问题,可以一起研究下:
    //adotb是本地表;adoq是远程数据库传入过来的数据
    adoq.close;
    adoq.sql.clear;
    adoq.sql.text :='select * from remoteTb where id ='+adotb.adofieldbyname('id').value;
    adoq.open;if adoq.recordcount =0 then
    begin
       adotb.append;
       ....
       adotb.post;
    end
    ------------------------------------
    体验速度,体验CSDN论坛助手:http://community.csdn.net/Expert/TopicView.asp?id=4700683
      

  3.   

    keiy() :
    你没看懂我提出的问题吧,或者没仔细思考,你给的网址内容与我的问题没关系。
      

  4.   

    Rubi(我们头说,语言无关了!所以我什么都搞):
      很感谢你的代码,不过也不是正解,请继续帮忙思考!
      

  5.   

    你的问题不就是将SQL2000导入access吗?,可以用ADO连上sqlserver(远程与本地没有关系,操作是一样的,只是连接串不一样)
    然后用
    insert into  opendatasource(...) select ... from ...
    这样的插入效率是最高的,且直接一面查,一面插(如果你的已经用ado查出记录了,那就可以直接在原有的查询基础上修改SQL就可以了,且该语法可直接用于SQL的查询分析器中)
      

  6.   

    keiy() :
        谢谢,周一上班我去试试,不过我总觉得这个方法不行,因为程序通过ADO把SQL语句传递到远程数据库中执行,那么Data Source="c:\doc\accessdb.mdb"这个路径服务器会认为是它本地路径,而不是客户端的路径,所以这个语句会出错,呵呵,这是我的猜想,试过才知道,等我好消息。
    INSERT INTO opendatasource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:\doc\accessdb.mdb";Jet OLEDB:Database Password=abc)... B04 (afield1,afield2,afield3,afield4,afield5,afield6)
    SELECT sfield1,sfield2,sfield3,sfield4,sfield5,sfield6
    FROM sqltablename
      

  7.   

    继续关注下,看到底是什么情况
    ------------------------------------
    体验速度,体验CSDN论坛助手:http://community.csdn.net/Expert/TopicView.asp?id=4700683
      

  8.   

    我试了一下,的确有你说的问题,它只能输出到服务器上,不过,还有一种方法:
    用ADO连ACCESS,然后执行
    'insert  into test(a,b,c,d)  select a,b,c,d from test IN [odbc][ODBC;Driver=SQL Server;UID=sa;PWD=;Server=servername;DataBase=master;]';
    这种方法没问题,我测试过
      

  9.   

    keiy() :
      用ADO连ACCESS,然后执行
    'insert  into test(a,b,c,d)  select a,b,c,d from test IN [odbc][ODBC;Driver=SQL Server;UID=sa;PWD=;Server=servername;DataBase=master;]';
    =====================================
    这个看上去应该可以,可是客户端无法直接去访问远程SQLServer,只能信赖远程服务器上的中间层进行访问,所以问题的关键就在于我的客户端ADOQuery已经获得查询结果时,如何快速的插入到本地的ACCESS中,请再帮忙想想。
      

  10.   

    如果这样,我目前还有一个方法,就是用XLSReadWriteII,它可将ADOQuery的结果直接写入execl文件,然后再写入access,从excel写入access可用上面类似的方法,在access中SQL的语法为:
    select * into <table name> from [excel 8.0;database=<filename>].[<sheetname>$]
    当然,它也有两个缺陷
    1.记录数不能超过65536
    2.要生成中间的excel文件
    你可在你的应用上试试,看看速度上是否会快于一条条插入
      

  11.   

    keiy() :
      非常感谢你热心的帮助,无论怎样,这100分都应该给你,再次感谢!