none
asp程序用opendatasource在sqlserver2008sp2下不能获得值??? RRS feed

  • 问题

  • 版本:Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (Intel X86)

    防火墙什么都是关闭的。

    asp写法1,远程的表:

    tmp1=conn.execute("select count(*) as tmp from opendatasource( 'SQLOLEDB', 'Data Source=ip;User ID=uid;Password=passwd' ).database1.dbo.xxx ")
    tmp2=tmp1("tmp")
    set tmp1=nothing
    response.write tmp2
    不能得到结果,显示是空的,但在查询分析器里可以看到是有值的:比如1


    写法2,不用opendatasource的本地表:
    tmp1=conn.execute("select count(*) as tmp from xxx ")
    tmp2=tmp1("tmp")
    set tmp1=nothing
    response.write tmp2

    可以得到结果为1

    如果本地表,也用写法1,采用opendatasource方式,还是不能得到值。


    我在其它平台sqlserver2000,2005,2008sp1上执行上面的两种写法都可以正确返回值1,难道是sqlserver2008sp2的bug,或者需要开启什么设置???

    2011年3月18日 7:03

答案

  • http://topic.csdn.net/u/20100425/10/1194e545-9b89-4cb2-a863-c0463b4c1253.html

    在这个帖子里  我查到 对方机器也需要做一些设置

     

    另外请参考

    http://msdn.microsoft.com/zh-cn/library/ms179856.aspx

    仅当 DisallowAdhocAccess 注册表选项针对指定的提供程序显式设置为 0,并且启用 Ad Hoc Distributed Queries 高级配置选项时,OPENDATASOURCE 才可用于访问 OLE DB 数据源中的远程数据。如果未设置这些选项,则默认行为不允许即席访问。

    OPENDATASOURCE 函数可以在能够使用链接服务器名的相同 Transact-SQL 语法位置中使用。因此,可以将 OPENDATASOURCE 用作四部分名称的第一部分,该部分名称引用 SELECT、INSERT、UPDATE 或 DELETE 语句中的表或视图的名称;或者引用 EXECUTE 语句中的远程存储过程。当执行远程存储过程时,OPENDATASOURCE 应该引用 SQL Server 的另一个实例。OPENDATASOURCE 不接受参数变量。

    与 OPENROWSET 函数类似,OPENDATASOURCE 应该只引用那些不经常访问的 OLE DB 数据源。对于访问次数较频繁的任何数据源,请为它们定义链接服务器。无论 OPENDATASOURCE 还是 OPENROWSET 都不能提供链接服务器定义的全部功能,例如,安全管理以及查询目录信息的功能。每次调用 OPENDATASOURCE 时,都必须提供所有的连接信息(包括密码)。

    重要说明重要提示

    Windows 身份验证比 SQL Server 身份验证要安全得多。应尽量使用 Windows 身份验证。OPENDATASOURCE 不应该用于连接字符串中的显式密码。

    每个提供程序的连接要求与创建链接服务器时的参数要求相似。在 sp_addlinkedserver (Transact-SQL) 主题中列出了很多常见提供程序的详细信息。

    任何用户都可以执行 OPENDATASOURCE。用于连接到远程服务器的权限由连接字符串确定。


    入了ipad,最近用ipad上论坛
    2011年3月21日 5:29

全部回复

  • 版本:Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (Intel X86)

    防火墙什么都是关闭的。

    asp写法1,远程的表:

    tmp1=conn.execute("select count(*) as tmp from opendatasource( 'SQLOLEDB', 'Data Source=ip;User ID=uid;Password=passwd' ).database1.dbo.xxx ")
    tmp2=tmp1("tmp")
    set tmp1=nothing
    response.write tmp2
    不能得到结果,显示是空的,但在查询分析器里可以看到是有值的:比如1


    写法2,不用opendatasource的本地表:
    tmp1=conn.execute("select count(*) as tmp from xxx ")
    tmp2=tmp1("tmp")
    set tmp1=nothing
    response.write tmp2

    可以得到结果为1

    如果本地表,也用写法1,采用opendatasource方式,还是不能得到值。


    我在其它平台sqlserver2000,2005,2008sp1上执行上面的两种写法都可以正确返回值1,难道是sqlserver2008sp2的bug,或者需要开启什么设置???

    建议您在sql 的查询分析器里面运行下看看,因为这完全是 sql server的功能,和asp没什么关系。

    初步判断可能是您的注册表里面没有  'SQLOLEDB'的oledb驱动程序注册   


    入了ipad,最近用ipad上论坛
    2011年3月18日 7:43
  • 建议转到 sql server区
    入了ipad,最近用ipad上论坛
    2011年3月18日 7:43
  • 前面已经写了查询分析器里可以看到是有值的,兄弟没看见?
    2011年3月18日 7:54
  • sql server目前没人可以答复
    2011年3月18日 7:55
  • 不好意思  工作间隙扫一下问题  漏看了

    请问您登录查询分析器的用户  和您 asp 运行的用户  登陆sqlserver 的账户是一样的么?

    您用asp 连接 sql 用的是哪个数据库驱动呢?


    入了ipad,最近用ipad上论坛
    2011年3月18日 8:12
  • 非常感谢兄弟。您的一句话提醒了我。

    我查询分析器用的是sa连进去的。而asp用的是单独建立的一个数据库用户tt,tt用户是数据库的owner

    然后再测试用sa执行非常正常,但是用tt连接查询分析器去执行时报了错误:

    服务器: 消息 7415,级别 16,状态 1,行 1
    已拒绝对 OLE DB 访问接口 'SQLNCLI10' 的即席访问。必须通过链接服务器来访问此访问接口。

    如果把asp那边的用户改成sa的可以正常执行了。

    但是sa的权限太高。给tt用户增加什么权限可以解决上面报错的问题呢?

    再次感谢!!!

    2011年3月18日 9:24
  • http://topic.csdn.net/u/20100425/10/1194e545-9b89-4cb2-a863-c0463b4c1253.html

    在这个帖子里  我查到 对方机器也需要做一些设置

     

    另外请参考

    http://msdn.microsoft.com/zh-cn/library/ms179856.aspx

    仅当 DisallowAdhocAccess 注册表选项针对指定的提供程序显式设置为 0,并且启用 Ad Hoc Distributed Queries 高级配置选项时,OPENDATASOURCE 才可用于访问 OLE DB 数据源中的远程数据。如果未设置这些选项,则默认行为不允许即席访问。

    OPENDATASOURCE 函数可以在能够使用链接服务器名的相同 Transact-SQL 语法位置中使用。因此,可以将 OPENDATASOURCE 用作四部分名称的第一部分,该部分名称引用 SELECT、INSERT、UPDATE 或 DELETE 语句中的表或视图的名称;或者引用 EXECUTE 语句中的远程存储过程。当执行远程存储过程时,OPENDATASOURCE 应该引用 SQL Server 的另一个实例。OPENDATASOURCE 不接受参数变量。

    与 OPENROWSET 函数类似,OPENDATASOURCE 应该只引用那些不经常访问的 OLE DB 数据源。对于访问次数较频繁的任何数据源,请为它们定义链接服务器。无论 OPENDATASOURCE 还是 OPENROWSET 都不能提供链接服务器定义的全部功能,例如,安全管理以及查询目录信息的功能。每次调用 OPENDATASOURCE 时,都必须提供所有的连接信息(包括密码)。

    重要说明重要提示

    Windows 身份验证比 SQL Server 身份验证要安全得多。应尽量使用 Windows 身份验证。OPENDATASOURCE 不应该用于连接字符串中的显式密码。

    每个提供程序的连接要求与创建链接服务器时的参数要求相似。在 sp_addlinkedserver (Transact-SQL) 主题中列出了很多常见提供程序的详细信息。

    任何用户都可以执行 OPENDATASOURCE。用于连接到远程服务器的权限由连接字符串确定。


    入了ipad,最近用ipad上论坛
    2011年3月21日 5:29