1、使用DAO(ADO无此功能):
    Dim str As String
    str = "ODBC;DSN=test;UID=sa;PWD=;Database=testDB;"
    Set wsp = DBEngine.CreateWorkspace("MainWS", "admin", "")
    Set dbtemp = wsp.OpenDatabase("", 0, 0, str)
    dbtemp.OpenRecordset "insert into XXTable select * from [;database=" & App.Path & "\db1.mdb].Table"
2、不行

解决方案 »

  1.   

    ADO 当然可以实现了(其实与"什么O"到无太大关系,关键是 SQL 支持):
    1:
    在 Ms Sql7 中 有 OPENROWSET (T-SQL)例 : 
        SELECT a.* 
        FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
         'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
         
        insert into sqlTbl_a 
        SELECT a.* 
        FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
         'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) Code:
    Dim adoConnection As New ADODB.Connection
    'ADODB.Connection 一定要连接 SQL Server
    adoConnection.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Data Source=billgate"
    adoConnection.Execute SQL参阅《如何转换ACCESS数据到SQL SERVER》
    http://go1.163.com/~askpro/msg22/qa72.htm2.当然也可以了,写到SP里:
      在 Ms Sql7 中 有 OPENROWSET (T-SQL)例 : 
        SELECT a.* 
        FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
         'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
         
        insert into sqlTbl_a 
        SELECT a.* 
        FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
         'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
      

  2.   

    也可以参见http://www.csdn.net/develop/read_article.asp?id=4033
      

  3.   

    哇!首先非常感谢playyuer(女爱㊣),我会立刻试试你的办法。
    其实我也一直很希望有其它的途径来解决这个问题,一直没找到方法就以为没有,我真是笨呀,呵呵……
        
      

  4.   

    在sp中,显示:
    ado错误:[oledb provider refurend message]找不到可安装的isam
      

  5.   

    其实你可以直接使用SQL7的数据转换工作,通过ODBC或OLE DB都可以把ACCESS中的数据插入到SQL中,反之也可以。哪用得着这么复杂。不过你如果只需要插入特定的一些数据的话,则只有通过编程来实现了。
      

  6.   

    SQL Server 所在的机器上要有 'Microsoft.Jet.OLEDB.4.0'
    装 MDAC_TYPE.exe
      

  7.   

    两个方法:
    1。用Openrowset,online doc有例子。注意字段的顺序,最好用select tableaccess.f1,tableaccess.f2,...;还有就是一些字段的format,入日期。2. 在Enterprise Manager作好DTS Package直接调用。两个方法我都用过。可行。
      

  8.   

    我的SQL Server 机器上有 'Microsoft.Jet.OLEDB.4.0',在vb中都可以调用。Jet数据库没有
    秘码,是不是我语法有错误。
      

  9.   

    另外,如何在sp中引用access中的表名?
      

  10.   

    aaa 与 bbb 的表结构应完全一样,且设 "ID_Field" 为主键:
    Code:
    Dim adoConnection As New ADODB.Connection
    'ADODB.Connection 一定要连接 SQL Server
    adoConnection.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Data Source=billgate"
    adoConnection.Execute SQLif sql7.0数据库的表aaa有新记录,then 插入到access表bbb 的SQL:
    INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'd:\nwind97.mdb';'admin';'', bbb)
    SELECT aaa.* 
    FROM aaa
    WHERE aaa.ID_Field NOT IN 
    (SELECT ID_Field 
    FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'd:\nwind97.mdb';'admin';'', bbb)
    )if access表bbb有记录,而sql7.0表aaa没有,then 删除access表bbb的记录的SQL:
    DELETE FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'd:\nwind97.mdb';'admin';'', bbb)
    WHERE ID_Field NOT IN (SELECT ID_Field FROM aaa)
      

  11.   

    playyuer:access和sql不在同一台电脑,sp编译通不过。客户端分布在不同的电脑。
      

  12.   

    在Client应用程序中凑 SQL ,
    adoConnection.Execute SQL 
    SP 确实不幸
      

  13.   

    SP code sample:
    CREATE PROCEDURE [test1] 
    @Path varchar(100), 
    @Provider varchar(200)='Microsoft.Jet.OLEDB.4.0',
    @User varchar(100)='Admin',
    @Password varchar(100)=''
    AS
    exec ('select * FROM OPENROWSET('''+ @Provider +''',''' + @Path + ''';'''+ @User +''';'''+ @Password+''', 产品)')
      

  14.   

    使用DTS是最为方便快捷的办法,DTS由于使用bluk insert技术,速度相当不错。我也写过基于RAS的程序,使用DTS速度相当令人满意。
    而且DTS本身就是自动化部件,所有的东西都可以在运行时修改。我的程序就坐到了可以动态连接不同的服务器,传送的数据以及数据过滤器都是可由用户来设置的。SQL2000的DTS还要强大,只是我还没有好好用过。
      

  15.   

    我有点越来越不明白了,我把sp帖在这里,麻烦你看一下:
    Alter Procedure sp_send
    /*将access的签到记录传送到sql7.0*/
    As insert into kqnote(sfzhm,time)
     SELECT sfzhm,time
        FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
        
      'd:\mrdx\sjk\jms.mdb';'admin';'', kqnote)
    where send = 0
    /*将以传送的记录标记*/
    update OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
        
      'd:\mrdx\sjk\jms.mdb';'admin';'', kqnote)
    set send = 1
    where send =0/*同步员工记录,添加新员工记录*/
    INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
        
      'd:\mrdx\sjk\jms.mdb';'admin';'', workers) (sfzhm,name)
    select  sqlsfzhm ,sqlname from sqlworkers
    where  sqlsfzhm NOT IN (select sfzhm  from OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
        'd:\mrdx\sjk\jms.mdb';'admin';'', workers)) /*如果sql7.0 cztime is null 则为在职员工。删除access的多的员工记录*/
    DELETE FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
        
      'd:\mrdx\sjk\jms.mdb';'admin';'', workers)
    where sfzhm NOT IN (select sqlsfzhm from sqlworkers where cztime is null)在我这个应用中,是不是不该用sp.我的结构是客户端分布在各处,数据用access,每日定时传送到sql7.0
    我希望客户端少维护和更改。    
      

  16.   

    你怎么还不明白,你的mdb路径应是动态的,你的SP产生的是"Design Time"错误,要把它变成"Run Time"错误!即在"Run Time"检查路径!
    请创建如下SP(copy 下来执行,别改,其实就是在 SP 里凑一个SQL,用 execute 执行),
    "\\yours\..\nwind97.mdb"为你的路径:CREATE PROCEDURE [MySPTest1]
    @UNCPath varchar(100) ='\\yuer\d\nwind97.mdb',--SP参数:可改为你默认的 mdb 路径
    @TableName varchar(100) ='产品'--SP参数:可改为你默认的表名
    AS
    declare @sql varchar(256)
    set @sql='select * FROM OPENROWSET('+'''Microsoft.Jet.OLEDB.4.0'',''' + @UNCPath + ''';'+'''admin'';'+''''',' +@TableName +')'
    execute (@sql)
    --exec ('select * FROM OPENROWSET('+'''Microsoft.Jet.OLEDB.4.0'',' +'''\\yours\..\nwind97.mdb'';'+'''admin'';'+''''',' +'产品)')--调用例句:
    --MySPTest1 'd:\nwind97.mdb','产品'
    --or
    --MySPTest1 
      

  17.   

    谢谢playyuer。
    客户端分布在各处,也就是\\yuer\d\nwind97.mdb'中,电脑名也要用参数,我不知这样理解对不对,如果这样就太麻烦了。我想这样勉强在sp中,也许不是经典的方法。
    再次谢谢playyuer,你让我学到了许多东西,尤其你回复很快。希望能多向你请教。另外也感谢所有关注次贴的朋友。
      

  18.   

    Sql中有一个OPENROWSET函数,可能直接打开一个Access文件,当作一个Sql表使用,
    不过Insert 会些问题,更新其中的text字段也有问题。可以看Sql联机文档。
      

  19.   

    http://www.csdn.net/expert/topicview1.asp