3

我们有一个简单的经典 ASP 应用程序,我们一直不愿意修改代码,以免引起一些早已死去的希腊诸神的愤怒。

我们最近需要向应用程序添加功能。功能实现实际上只是一个数据库操作,需要对 UI 进行最小的更改。

我更改了 UI 并进行了小修改,以向 sproc 调用 (sproc1) 提交一个新的数据值。

在直接从 ASP 调用的 sproc1 中,我们添加了对恰好位于另一台服务器 sproc2 上的另一个 sproc 的新调用。

不知何故,这不能通过我们的 ASP 应用程序工作,但可以在 SQL Management Studio 中工作。

以下是技术细节:

  1. 两个数据库服务器上的 SQL 2005。
  2. Sql Login 正在从 ASP 应用程序向 SQL 2005 Server 1 进行身份验证。
  3. 从服务器 1 到服务器 2 的链接服务器正在工作。
  4. 从 SQL Management Studio 执行 sproc1 时 - 工作正常。即使被认证为我们的代码使用的同一用户(应用程序 sql 登录)。
  5. sproc2 在独立于 SQL Management Studio 中的 sproc1 调用时工作。
  6. VBScript (ASP) 捕获在 XML 中发送回客户端的错误。错误编号为 0,错误描述为空白。来自 ADODB.Connection 对象和来自 ASP 端在 VBScript 中产生的任何 Err.Number/Err.Description。

所以没有任何错误,也没有任何可重复性(即通过 SQL Mgmt Studio) - 有人知道这个问题吗?

我们目前的计划是分解并深入研究 ASP 端的代码,并直接从 ASP 对 Server 2.sproc2 进行完全独立的调用,而不是尝试通过 sproc1 捎带。

4

9 回答 9

3

您在两个存储过程中都设置了set nocount吗?我曾经遇到过类似的问题,虽然我现在不记得我是如何解决的,但我知道这与它有关!

于 2008-09-20T10:55:50.247 回答
1

你可能会遇到双跳问题

双跃点问题是当 ASP/X 页面尝试使用位于不同于 IIS 服务器的服务器上的资源时。

Windows NT Challenge/Response不支持双跳模拟(因为一旦传递到 IIS 服务器,相同的凭据就不能传递到后端服务器进行身份验证)。

您应该使用 SQL Profiler 验证尝试的第二个连接。

请注意,通过手动测试,您不是通过 IIS 进行身份验证。只有当您通过 ASP/X 页面启动 sql 时才会出现此问题。

更多资源:

于 2008-09-20T08:16:32.547 回答
1

I had a similar problem and I solved it by setting nocount on and removing print commands.

于 2009-01-22T08:40:25.697 回答
0

示例代码可能会有所帮助:) 您是否尝试从存储过程中返回两个表?我不认为 ADO 2.6 可以处理返回的多个表。

于 2008-09-20T08:24:13.153 回答
0

我确实考虑过(双跳),但是像我所指的 sproc-in-a-sproc 调用与通过 INNER JOIN 进行的典型跨服务器连接有什么区别?两者都将在 Server1 上执行,使用 Linked Server 凭据,并向 Server 2 进行身份验证。

任何人都可以确认调用 sproc 跨服务器与在数据表上进行连接不同吗?为什么?

如果链接服务器配置是 sql 帐户 - 是否被视为双跳(因为您指的是 NTLM 双跳?)

至于是否有多个结果集回来 - 没有。Server1.Sproc1 和 Server2.Sproc2 在 .net 世界中都是“ExecuteNonQuery()”并且什么都不返回(没有结果集也没有返回值)。

于 2008-09-20T08:26:00.480 回答
0

尝试检查连接字符串中指定的用户对数据库的权限。使用sql mgmt studio时,在连接字符串中使用相同的用户名登录数据库。

创建一些临时表来写入中间值和异常,因为它可以是调试应用程序的有效方法。

于 2008-09-20T10:44:39.007 回答
0

我可以检查一下:您添加了 sproc2 吗?在此之前,它可以正常工作多年。

你不能改变你从哪里调用 sproc2 吗?与其从 sproc1 内部调用它,不如从 ASP 调用它?这样您就可以在代码中控制对 SQL 的身份验证,而不必依赖在服务器上设置任何信任或共享远程身份验证。

于 2008-09-20T12:44:43.073 回答
0

您的链接服务器是如何设置的?对于如何向远程服务器进行身份验证,您通常有一些选项,其中包括以当前登录用户身份登录或指定始终使用的 SQL 登录名。您是否尝试将其设置为始终使用特定帐户?这应该消除调用远程过程中任何可能的权限问题......

于 2008-09-20T14:04:56.920 回答
0

我的第一反应是,这可能不是调用跨服务器的问题,而是从第一个调用第二个 proc 的问题,可能是在两个不同环境中表现不同的原因。

我的第一个问题是:如果从等式中删除跨服务器方面会发生什么?如果您可以设置一个测试系统,其中您的第一个 proc 调用您的第二个 proc,但第二个 proc 位于同一服务器和/或同一数据库中,您还会遇到同样的问题吗?

沿着同样的思路:根据我的经验,当应用程序和 SSMS 得到不同的结果时,通常是存储过程设置的问题。正如卢克所说,它可能是NOCOUNT。尽管我似乎记得 PRINTed 值成为错误描述的一部分(非常违反直觉),但我已经从代码中无关的 PRINT 语句中发生了这种事情。

如果在 SSMS 中运行此消息时在消息窗口中返回任何内容,请找出它的来源并使其停止。我必须查找技术术语,但我记得不同的查询环境对“错误”的敏感性不同,并且通过 SSSM 的默认连接不会在某些时候抛出错误,而来自脚本语言的 ADO 连接将.

最后一个想法:如果它是环境问题,请尝试在 ASP 页面的连接字符串上设置不同的设置。例如,如果您有 OLEDB 连接,请尝试 ODBC。尝试本机和非本机 SQL Server 驱动程序。查看您的提供商支持哪些连接字符串选项,并尝试其中任何一个似乎值得尝试的选项。

于 2008-09-20T22:14:21.440 回答