Test.txt文件 定长记录
0001abcdefg   sdsdsafsdfsfsfdsdfsf         u
0002hijk      rrttfggf                      
------------------------------------------------
Schema.ini 配置文件 
[test.txt]
ColNameHeader=False
Format=FixedLength
FixedFormat= RaggedEdge
MaxScanRows=0
CharacterSet=OEM
Col1="id" char Width 4
Col2="name" char Width 10
Col3="addr"  char Width 30
-----------------------------------------------
accdb.mdb中表tab1
id    文本 长度4
name  文本 长度10
addr  文本 长度30
phone 文本 长度20
-------------------------------------------------
请教 如何写 用test.txt中的记录批量更新tb1中的字段addr 的sql语句?(条件:tb1.id=[test.txt].id)
谢谢!
注:for next逐个记录update的方法就不要了

解决方案 »

  1.   

    Cn1.Execute "Select * into 用户表 From " & App.Path & "\Test.txt.txt"
      

  2.   

    Cn1.Execute "Select * into " & App.Path & "\db2.mdb.用户表 From " & App.Path & "\Test.txt"
      

  3.   

    Option ExplicitSub Main()
        Dim cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        
        Set cn = New ADODB.Connection
        cn.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\temp\db1.mdb;Uid=Admin;Pwd=;"
        
        cn.Execute "INSERT INTO tab1(id,name,addr) " & _
                   "SELECT id,name,addr " & _
                   "FROM [Text;FMT=Fixed;HDR=No;DATABASE=C:\temp\;].[test#txt]"
        
        Set rs = cn.Execute("SELECT * FROM tab1")
        Debug.Print rs.GetString()
    End Sub
      

  4.   

    这样测试不成功Private Sub Command1_Click()
        
        Dim db As Object    Set db = CreateObject("ADODB.Connection")
        
        '引擎*********************
        '用txt这个方式差太远
    '    db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\;Extended Properties=""" & "text;HDR=no;"""    '用access这个方式还靠边
        db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\accdb.mdb;Persist Security Info=False"
        
        '借用老虎这个也一样
    '    db.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & App.Path & "\accdb.mdb;Uid=Admin;Pwd=;"
        '**************************
        
        
        '操作$$$$$$$$$$$$$$$$$$$$$$
        '插入没有问题
    '    db.Execute "Insert Into tab1(id,name,addr,phone)   select * from [text;database=" & App.Path & "\].[test.txt]"
        
        '这种方式修改,提示错误 "该isam不支持在链接表中更新数据"
        db.Execute "update tab1 inner join [text;database=" & App.Path & "\].[test.txt] as tab2  on tab1.id=tab2.id set tab1.addr=tab2.addr "
        
        '这种方式修改,提示错误 "操作必须使用一个可更新的查询",试验access不支持这种方式,oracle可以
    '    db.Execute "update tab1  set addr=(select addr from  [text;database=" & App.Path & "\].[test.txt] as tab2   where tab2.id=tab1.id)"    'access两个数据库操作没有问题
    '    db.Execute "update tab1 inner join [;database=" & App.Path & "\accdb2.mdb].[tab3] as tab2  on tab1.id=tab2.id set tab1.addr=tab2.addr "
        '$$$$$$$$$$$$$$$$$$$$$$$$$$$
        
        
        db.Close
        Set db = NothingEnd Sub
      

  5.   

    看看有没有高手找到能用的方式
    貌似不是引擎的问题,我在access里试验也一样的问题在access里查询txt可以,插入可以,联表修改就不可以
      

  6.   

    实在不行,建议lz这样做1。根据ini在access里创建表,最好另外建access文件,(感觉你的txt和access的结构差不多,可以直接用现有的access复制)2。txt文件数据导入创建的表3。用创建的表和access中要修改的表联表修改
      

  7.   

    链接表更新不行
    http://support.microsoft.com/kb/824159/zh-cn
      

  8.   

    insert into /select into 都可以实现的
    我之所以想直接update,是不想在vb代码中涉及表字段更新这部分
    (这部分我准备都保存在sql脚本里 以便于数据升级后更新过程修改维护)
    如果把txt内容into到mdb,那么还不如直接rs.open "selelct * from [text;database=c:\].[test#txt]"
    然后逐条更新mdb字段了
    各位老大还是集思广意 想想怎么直接update吧
    谢谢!
      

  9.   

    db.Execute "update tab1 inner join [text;database=" & App.Path & "\].[test.txt] as tab2  on tab1.id=tab2.id set tab1.addr=tab2.addr "
        
        '这种方式修改,提示错误 "操作必须使用一个可更新的查询"
    ========================================================================
    难道这就是access/txt update的宿命?
      

  10.   


        '这种方式修改,提示错误 "该isam不支持在链接表中更新数据"
        db.Execute "update tab1 inner join [text;database=" & App.Path & "\].[test.txt] as tab2  on tab1.id=tab2.id set tab1.addr=tab2.addr "
      

  11.   

    该isam不支持在链接表中更新数据
    ——————————————————
    我看到这个错误就泄气了
    *************************************************
    看老虎这个链接
      

  12.   


    曲线救国
    ****************************************
    access两个数据库联表修改是允许的
        'access两个数据库操作没有问题
    '    db.Execute "update tab1 inner join [;database=" & App.Path & "\accdb2.mdb].[tab3] as tab2  on tab1.id=tab2.id set tab1.addr=tab2.addr "
    ***************************************看7楼
    1。另外建access文件,根据ini在这里创建表2。txt文件数据导入新建的access的表里3。用新建的access的表和原access中的表联表修改
      

  13.   

    是的  我也决定分2步走了 
    在vb里写一段模仿sqlplus的代码 逐语句执行了
    如果哪位以后有个更好的办法 请务必发帖公告一下
    谢谢各位老师了 结贴了
      

  14.   


    你没有理解我的意思,
    不是让你逐语句执行1。另外建access文件,根据ini在这里创建表
    新建access比如为accdb2.mdb
    根据Schema.ini的这些信息
    Col1="id" char Width 4
    Col2="name" char Width 10
    Col3="addr" char Width 30
    建表tab22。txt文件数据导入新建的access的表里
    db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\accdb2.mdb;Persist Security Info=False"
    db.Execute "Insert Into tab2(id,name,addr)   select * from [text;database=" & App.Path & "\].[test.txt]"
    3。用新建的access的表和原access中的表联表修改 
    db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\accdb.mdb;Persist Security Info=False"
    db.Execute "update tab1 inner join [;database=" & App.Path & "\accdb2.mdb].[tab2] as tab2  on tab1.id=tab2.id set tab1.addr=tab2.addr "
      

  15.   

    To jhone99:
    谢谢 我的做法也是这样
    我所说的"逐语句" 也就是指:导入access;联表update