本帖最后由 majunbo 于 2010-09-02 01:53:33 编辑

解决方案 »

  1.   

    http://topic.csdn.net/u/20100901/13/7add1a44-a584-43e7-99d9-d812b0a9bf47.html
    看看帖子中三楼的方法,谢谢。
      

  2.   

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ws_hgo/archive/2010/04/23/5518918.aspx/*
    openDatasource:不使用连接服务器的名称,而提供特殊的链接信息.
    使用openDatasource的前提是仅当 DisallowAdhocAccess 
    注册表选项针对指定的提供程序显式设置为 0,
    并且启用 Ad Hoc Distributed Queries 高级配置选项时,
    OPENDATASOURCE 才可用于访问 OLE DB 数据源中的远程数据。
    如果未设置这些选项,则默认行为不允许即席访问。
    */
    --代码如下:
    exec sp_configure 'show advanced options',1
    reconfigure
    exec sp_configure 'Ad Hoc Distributed Queries',1
    reconfigure
    --(1)例如现在我想打开D盘中BJData.mdb中的BJAdmin表的信息
    select ID,Title,OwnerName from 
    opendataSource('Microsoft.Jet.OLEDB.4.0','Data Source="D:\BJData.mdb";')...BJAdmin
    /*Results:
    ID          Title                OwnerName
    ----------- -------------------- --------------------------------------------------
    1           xinrong              
    4           webmaster            admin
    5           bing                 webmaster
    (3 行受影响)
    */
    --(2)我现在要将BJAdmin中BJNewsCategory中的信息插入到A表中
    --先查询下Test.Newscategory
    select * from  Test.dbo.Newscategory
    /*
    ID          Title
    ----------- --------------------
    1           MSSQL
    (1 行受影响)
    */
    insert into Newscategory select Title from OpenDataSource
    ('Microsoft.Jet.OLEDB.4.0','Data Source="D:\BJData.mdb";')...BJNewsCategory
    --导入之后再查询
    select * from  Test.dbo.Newscategory
    /*
    ID          Title
    ----------- --------------------
    1           MSSQL
    2           新闻分类
    3           新闻动态
    4           工程案例
    5           膜结构知识
    6           在建工程
    (6 行受影响)
    */
    --上面的都是在MSSQL中查询Access中的信息,现在将MSSQL中的信息导入到Access中去
    --(3)将AdminInfo的信息插入到BJData.mdb中的BJAdmin中去
    select * from Test.dbo.AdminInfo
    /*
    ID          Title
    ----------- ------------------------------
    1           ws_hgo
    (1 行受影响)
    */
    insert into opendatasource('microsoft.Jet.OLEDB.4.0','Data source="D:/BJData.mdb"')...BJAdmin
    (Title,RoleID) select Title,1 from AdminInfo
    --然后查询BJAdmin表的信息
    select ID,Title,OwnerName from 
    opendataSource('Microsoft.Jet.OLEDB.4.0','Data Source="D:\BJData.mdb";')...BJAdmin 
    /*
    ID          Title                OwnerName
    ----------- -------------------- --------------------------------------------------
    1           xinrong              
    4           webmaster            admin
    5           bing                 webmaster
    12          ws_hgo               NULL
    (4 行受影响)
    */
    --(4)上面说的是Access与MSSQl之间的操作现在操作下
    --Excel与MSSQL之间的操作
    --从Excel中读取信息
    select * from OpenDataSource
    ('Microsoft.Jet.OLEDB.4.0','Data Source="D:\work.et";Extended properties=Excel 5.0')...[sheet1$]
    /*
    EmployeeName        Sex            Age             Post
    -----------       -----------    --------      ------------ 
    ws_hgo             Boy            23             Senior Programmer
    yangzhognyuan      Boy            24             Programmer
    chenjing           Girl           24             Designer
    (3 行受影响)--(5)
    */
    /*将本地表中的信息导入到远程数据库表中
    下面的例子将本地whsxjAdmin种的(Title,Password)插入到远程
    zhongyiAdmin中去
    */
    insert into opendatasource('SQLOLEDB','Data Source=IP地址;User ID=zhongyi;password=xinrongkeji').sqlzhongyi.dbo.zhongyiAdmin(Title,Password)
    select Title,Password from whsxjAdmin
      

  3.   


    我是把EXCEL中的数据导入到DBF中,EXCEL中可以正常读取,甚至也可以和DBF关联,但是插入出问题了,我昨天 晚上找了半天,也没有找到。
    你说的三楼只是把EXCEL插入到新的本地表中,
    我说的是插入到BDF,可以说是远程表。
      

  4.   

    to:ws_hgo我看了你的内容,我觉得有几点我没说清楚:1、我可以从EXCEL或DBF中查询出数据,甚至插入也可能没问题吧,但是更新有问题,我的更新可能是多条记录,是不是需要编写循环?我不会写这个。2、你给的代码和文章只是读取EXCEL并插入到本地表中,没有操作DBF的示例,所以,是不是我的编写有问题,还是我没看懂你给的?
      

  5.   

    主要错误信息是:
    服务器: 消息 7333,级别 16,状态 2,行 1
    未能用书签从 OLE DB 提供程序 'MICROSOFT.JET.OLEDB.4.0' 中提取行。
    [OLE/DB provider returned message: 多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。]
    OLE DB 错误跟踪[OLE/DB Provider 'MICROSOFT.JET.OLEDB.4.0' IRowsetLocate::GetRowsByBook returned 0x80040e21:  ]。
    UPDATE openrowset('MICROSOFT.JET.OLEDB.4.0','dBase 5.0;DATABASE=F:\样例\','select * from GZZK1007')   
    SET NGGZ=CONVERT(NUMERIC(15,2),A.[超额工资/节余工资])--,ZT=CONVERT(NUMERIC(15,2),A.[绩效浮动]),JT=CONVERT(NUMERIC(15,2),A.[可控节超]),ST=CONVERT(NUMERIC(15,2),A.[个人罚]) 
    FROM openrowset('Microsoft.Jet.OLEDB.4.0','EXCEL 5.0;hdr=yes;database=F:\样例\20100711.xls;',sheet1$) AS A inner join 
    openrowset('MICROSOFT.JET.OLEDB.4.0','dBase 5.0;DATABASE=F:\样例\','select * from GZZK1007') AS B 
    ON A.GONGHAO=B.GONGHAO 我觉得是我的UPDATE语句编写的有问题,可能是语法问题,但是我查了半天也不知道 如何改。
    分不够的话再加,我一年也没问过几个问题,还是大侠帮帮忙啊
      

  6.   

    --try
    UPDATE B 
    SET B.NGGZ=CONVERT(NUMERIC(15,2),A.[超额工资/节余工资])
    FROM 
    openrowset('Microsoft.Jet.OLEDB.4.0','EXCEL 5.0;hdr=yes;database=F:\样例\20100711.xls;',sheet1$) AS A 
    inner join 
    openrowset('MICROSOFT.JET.OLEDB.4.0','dBase 5.0;DATABASE=F:\样例\','select * from GZZK1007') AS B 
    ON A.GONGHAO=B.GONGHAO 
      

  7.   


    --(5)
    */
    /*将本地表中的信息导入到远程数据库表中
    下面的例子将本地whsxjAdmin种的(Title,Password)插入到远程
    zhongyiAdmin中去
    */
    insert into opendatasource('SQLOLEDB','Data Source=IP地址;User ID=zhongyi;password=xinrongkeji').sqlzhongyi.dbo.zhongyiAdmin(Title,Password)
    select Title,Password from whsxjAdmin
      

  8.   

    我试了,你给的SQL提示结果如下:

    服务器: 消息 208,级别 16,状态 1,行 1
    对象名 'B' 无效。
    服务器: 消息 7399,级别 16,状态 1,行 1
    OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 报错。提供程序未给出有关错误的任何信息。
    OLE DB 错误跟踪[OLE/DB Provider 'Microsoft.Jet.OLEDB.4.0' IDBInitialize::Initialize returned 0x80004005:  提供程序未给出有关错误的任何信息。]。
    ”是不是更新表不能有别名?
      

  9.   

    兄弟,我问的是UPDATE,你反复给我INSERT是什么意思,或者你指出我哪里出错了也可以啊。
    更新和插入是有区别的啊,我的更新是不是多条的原因呢。你有没有仔细看啊。
      

  10.   

    UPDATE B 
    SET B.NGGZ=CONVERT(NUMERIC(15,2),A.[超额工资/节余工资])
    FROM 
        openrowset('Microsoft.Jet.OLEDB.4.0','EXCEL 5.0;hdr=yes;database=F:\样例\20100711.xls;',sheet1$) AS A 
    inner join 
        openrowset('MICROSOFT.JET.OLEDB.4.0','dBase 5.0;DATABASE=F:\样例\','select * from GZZK1007.DBF') AS B 
    ON A.GONGHAO=B.GONGHAO 
      

  11.   


    兄弟,你给我的语句提示:“对象名 'B' 无效。”我知道 ws_hgo 是想给我方法,他给我的那个例子我也看过了,甚至:
    http://topic.csdn.net/u/20080523/11/08e4624a-13d1-4a6c-a9bc-7cfdd721a351.html
    这里的我也看过了,
    你能不能指出我的语句错误的地方?
    UPDATE openrowset('MICROSOFT.JET.OLEDB.4.0','dBase 5.0;DATABASE=F:\样例\','select * from GZZK1007')   
    SET NGGZ=CONVERT(NUMERIC(15,2),A.[超额工资/节余工资]) 
    FROM openrowset('Microsoft.Jet.OLEDB.4.0','EXCEL 5.0;hdr=yes;database=F:\样例\20100711.xls;',sheet1$) AS A inner join 
    openrowset('MICROSOFT.JET.OLEDB.4.0','dBase 5.0;DATABASE=F:\样例\','select * from GZZK1007') AS B 
    ON A.GONGHAO=B.GONGHAO 
      

  12.   


    兄弟,我又测试了你的语法,如下是正确的:
    update b 
    set b.minTime=a.minTime,b.maxTime=a.maxTime
    from new.dbo.table as a inner join clm_classtable as b 
    on a.andcode=b.classcode 
    where (a.andcode='JX0' OR a.andcode='JX4' OR a.andcode='JX8')在使用本地表的时候是正确的,看来我的错误信息主要是openrowset的更新问题。有人建议“建议用链接服务器吧 openrowset opendatesource问题多多 特别是远程更新”
    请问,我的一个.dbf的文件,如果用链接服务器?
      

  13.   

    汗!是SQL2000 。
    等高手解答。
      

  14.   


    恩,2000怎么了。
    我用2000连接的EXCEL AND DBF进行远程更新,并用了2000进行本地数据测试。
    同样语法远程不行,本地可以。
      

  15.   

    大家上午好,问题我已经解决了,使用OpenRowset确实是有问题,最后我更换了链接服务器就好了,代码如下:
    --创建链接服务器 
    exec sp_addlinkedserver 'dbf','','MICROSOFT.JET.OLEDB.4.0','F:\样例\','','dBase 5.0' 
    exec sp_addlinkedserver 'ex','','MICROSOFT.JET.OLEDB.4.0','F:\样例\20100711.xls','','Excel 5.0' 
    exec sp_addlinkedsrvlogin  'dbf','false',null, 'admin', ''
    exec sp_addlinkedsrvlogin  'ex','false',null, 'admin', ''--查询示例 
    select [台帐小计],* from ex...sheet1$ where gonghao='11001'
    select NGGZ,* from dbf...GZZK1007 where gonghao='11001'UPDATE B 
    SET B.NGGZ=A.[可控节超]  
    from ex...sheet1$ AS A inner join 
    dbf...GZZK1007 AS B 
    ON A.GONGHAO=B.GONGHAO --删除链接服务器 
    exec sp_dropserver 'dbf','droplogins' 
    exec sp_dropserver 'ex','droplogins' 在此感谢大家的帮忙。
    在此特别感谢@ws_hgo @claro