none
“SQLServer”和“Oracle”数据库对接问题,期待大师,期待,期待,期待 RRS feed

  • 问题


  • declare ImpCursor cursor for 
    select WDS.MeterNo  as  MeterNo, f_meterday_date, f_meterday_used  as  Qty

     from openrowset('msdaora','.';'scott';'123456','select  f_meter_code, f_meterday_date, f_meterday_used  from  t_rp_meter_dayenergytemp')   as  DS  

     left  join  WaterDatasSetting    WDS
     on  DS.f_meter_code=WDS.JDMeterNo 
     where   f_meter_code is not null
     and f_meterday_date is not null
     and f_meterday_used>=0
      order by f_meterday_date

    提示错误信息:
      消息 7308,级别 16,状态 1,过程 Usp_WaterImp,第 22 行
    因为 OLE DB 访问接口 'msdaora' 配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询。


    问题一:“因为 OLE DB 访问接口 'msdaora' 配置为在单线程单元模式下运行”什么意思???   什么叫做“单线程单元模式下运行”???

    问题二:“该访问接口无法用于分布式查询”,什么叫做“分布式查询”???     跨越数据库查询就叫做“分布式查询”吧。

    问题三:应该怎样解决这样的问题呢???

    问题四:“update openrowset()  set  set lable=1”这样可以修改对应的“Oracle”数据库中表的数据吧?     openrowset()就像“表”一样。




    declare @LastTime    char(10)

    set @LastTime = CONVERT(varchar(100),(select  top 1   DATime  from  DataETL  where  MeterType='WM'  order  by  DATime  desc),23)
    set  @oraclesql='select  f_meter_code, f_meterday_date, f_meterday_used  from  t_rp_meter_dayenergytemp   where    f_meterday_date >      '''+@LastTime+''''


    declare ImpCursor cursor for select f_meter_code, f_meterday_date, f_meterday_used
     from openrowset('msdaora','.';'scott';'123456',''''+@oraclesql+'''')

    问题五:这样“拼接字符串”做为参数好像不行啊???    直接以‘select  f_meter_code, f_meterday_date, f_meterday_used  from  t_rp_meter_dayenergytemp ’做为参数是没有问题的,那么“@LastTime” 变量怎样传入方法中呢???

    问题六:写的“openrowset”方法访问本地“Oracle”数据库没有问题吧。
    msdaora:MSDAORA是OLEDB FOR ORACLE的驱动

    ".":本地服务器

    "scott":用户名

    "123456":密码

    "@oraclesql":操作语句

    疑问:不用指定“Oracle”数据库的名字啊???    数据库的名字叫做“orcl”...不用指定吗???


    问题七:配置Oracle和MSSQL  TNS



    这里口令输不进去了,就算输进去也是提示“无法连接”的。
       这个问题应该如何处理???  为什么配置不正确呢???







    问题八:通过“openrowset”实现“SQLServer”访问“Oracle”一定要配置“TNS”吗??? 


    Science and technology is my lover.



    2012年12月12日 7:12

答案

  • 问题一:“因为 OLE DB 访问接口 'msdaora' 配置为在单线程单元模式下运行”什么意思???   什么叫做“单线程单元模式下运行”???

    单线程单元模式就是STA(Single-threaded apartment)模式。在STA线程模式中,对线程的所有调用都放到一个队列中,然后逐个处理这些调用。因此,STA线程永远不会同时执行多个方法。

    问题二:“该访问接口无法用于分布式查询”,什么叫做“分布式查询”???     跨越数据库查询就叫做“分布式查询”吧。

    分布式查询从多异类数据源中访问数据。这些数据源可以存储在同一台计算机或不同的计算机上。Microsoft SQL Server 通过使用 OLE DB 来支持分布式查询。

    详见:http://technet.microsoft.com/zh-cn/library/ms188721.aspx

    问题三:应该怎样解决这样的问题呢???

    参考:
    http://www.cnblogs.com/tippoint/archive/2012/05/09/2491496.html

    2012年12月16日 8:49
    版主
  • 问题四:“update openrowset()  set  set lable=1”这样可以修改对应的“Oracle”数据库中表的数据吧? openrowset()就像“表”一样。

    可以这样用,官方说明中提到:
    UPDATE 语句可以更改表或视图中单行、行组或所有行的数据值。还可以用该语句更新远程服务器上的行(使用链接服务器名称或 OPENROWSET、OPENDATASOURCE 和 OPENQUERY 函数),前提是用来访问远程服务器的 OLE DB 访问接口支持更新操作。
    详见:http://technet.microsoft.com/zh-cn/library/ms188724(v=sql.105)

    问题五:这样“拼接字符串”做为参数好像不行啊???    直接以‘select  f_meter_code, f_meterday_date, f_meterday_used  from  t_rp_meter_dayenergytemp ’做为参数是没有问题的,那么“@LastTime” 变量怎样传入方法中呢???

    OPENROWSET 不接受参数变量。
    详见:http://msdn.microsoft.com/zh-cn/library/ms190312.aspx

    可以动态拼接,然后exec。

    问题六:不用指定“Oracle”数据库的名字啊???数据库的名字叫做“orcl”...不用指定吗???
    'datasource'
    对应于特定 OLE DB 数据源的字符串常量。 datasource 是要传递给访问接口的 IDBProperties 接口的 DBPROP_INIT_DATASOURCE 属性,该属性用于初始化访问接口。 通常,此字符串包含数据库文件的名称、数据库服务器的名称,或者访问接口能理解的用于定位数据库的名称。


    2012年12月16日 8:56
    版主
  • 问题七:配置Oracle 的TNS配置,这个问题应该如何处理???  为什么配置不正确呢???

    地址对不对?端口对不对?端口是不是打开了?、根据上面的内容和无法连接的错误提示,我判断不了问题根据所在。

    问题八:通过“openrowset”实现“SQLServer”访问“Oracle”一定要配置“TNS”吗???

    不是用openrowset才需要配tns,在ORACLE当中,如果想访问某个服务器,必需要设置TNS,它不想SQLSERVER那样,客户端会自动列举出在局域网内所有的在线服务器,只需在客户端选择需要的服务器,然后使用帐号与密码登录即可。而ORCAL是不会自动列举出网内的服务器的,需要通过读取TNS配置文件才能列出经过配置的服务器名。

    2012年12月16日 9:07
    版主

全部回复

  • 问题一:“因为 OLE DB 访问接口 'msdaora' 配置为在单线程单元模式下运行”什么意思???   什么叫做“单线程单元模式下运行”???

    单线程单元模式就是STA(Single-threaded apartment)模式。在STA线程模式中,对线程的所有调用都放到一个队列中,然后逐个处理这些调用。因此,STA线程永远不会同时执行多个方法。

    问题二:“该访问接口无法用于分布式查询”,什么叫做“分布式查询”???     跨越数据库查询就叫做“分布式查询”吧。

    分布式查询从多异类数据源中访问数据。这些数据源可以存储在同一台计算机或不同的计算机上。Microsoft SQL Server 通过使用 OLE DB 来支持分布式查询。

    详见:http://technet.microsoft.com/zh-cn/library/ms188721.aspx

    问题三:应该怎样解决这样的问题呢???

    参考:
    http://www.cnblogs.com/tippoint/archive/2012/05/09/2491496.html

    2012年12月16日 8:49
    版主
  • 问题四:“update openrowset()  set  set lable=1”这样可以修改对应的“Oracle”数据库中表的数据吧? openrowset()就像“表”一样。

    可以这样用,官方说明中提到:
    UPDATE 语句可以更改表或视图中单行、行组或所有行的数据值。还可以用该语句更新远程服务器上的行(使用链接服务器名称或 OPENROWSET、OPENDATASOURCE 和 OPENQUERY 函数),前提是用来访问远程服务器的 OLE DB 访问接口支持更新操作。
    详见:http://technet.microsoft.com/zh-cn/library/ms188724(v=sql.105)

    问题五:这样“拼接字符串”做为参数好像不行啊???    直接以‘select  f_meter_code, f_meterday_date, f_meterday_used  from  t_rp_meter_dayenergytemp ’做为参数是没有问题的,那么“@LastTime” 变量怎样传入方法中呢???

    OPENROWSET 不接受参数变量。
    详见:http://msdn.microsoft.com/zh-cn/library/ms190312.aspx

    可以动态拼接,然后exec。

    问题六:不用指定“Oracle”数据库的名字啊???数据库的名字叫做“orcl”...不用指定吗???
    'datasource'
    对应于特定 OLE DB 数据源的字符串常量。 datasource 是要传递给访问接口的 IDBProperties 接口的 DBPROP_INIT_DATASOURCE 属性,该属性用于初始化访问接口。 通常,此字符串包含数据库文件的名称、数据库服务器的名称,或者访问接口能理解的用于定位数据库的名称。


    2012年12月16日 8:56
    版主
  • 问题七:配置Oracle 的TNS配置,这个问题应该如何处理???  为什么配置不正确呢???

    地址对不对?端口对不对?端口是不是打开了?、根据上面的内容和无法连接的错误提示,我判断不了问题根据所在。

    问题八:通过“openrowset”实现“SQLServer”访问“Oracle”一定要配置“TNS”吗???

    不是用openrowset才需要配tns,在ORACLE当中,如果想访问某个服务器,必需要设置TNS,它不想SQLSERVER那样,客户端会自动列举出在局域网内所有的在线服务器,只需在客户端选择需要的服务器,然后使用帐号与密码登录即可。而ORCAL是不会自动列举出网内的服务器的,需要通过读取TNS配置文件才能列出经过配置的服务器名。

    2012年12月16日 9:07
    版主
  • 谢谢大师,不甚感激。。。

    Science and technology is my lover.

    2012年12月17日 8:29
  • 谢谢,大师谢谢,受益匪浅。

    "listener.ora"和“tnsnames.ora”,直接复制“Oracle”服务端的给连接“客户端”的程序使用,一般都会好使吧???


    在客户端机器上手动创建“tnsnames.ora”有时候,不太好用。

    “listener.ora”在客户端上也必须自己手动创建吧,不然连接提示找不到“监听程序”。

    Oracle  客户端也要有“tnsnames.ora”和"listener.ora",SQLServer就不需要了吧。


    Science and technology is my lover.



    2012年12月17日 8:32
  • 我以前都是手工创建的,客户端也需要有,但是SQL Server 不需要。
    2012年12月17日 11:52
    版主