我们有一个经典的ASP应用程序,只是工作,我们一直厌恶修改代码,以免我们引起一些长期死亡的希腊神的愤怒。
我们最近要求为应用程序添加功能。功能实现实际上只是一个数据库操作,只需要对UI进行最小的更改。
我更改了UI并进行了小修改,以便为sproc调用(sproc1)提交新的数据值。
在直接从ASP调用的sproc1中,我们向另一个正好位于另一个服务器sproc2上的sproc添加了一个新调用。
不知何故,这不适用于我们的ASP应用程序,但适用于SQL Management Studio。
以下是技术细节:
所以没有任何错误,也没有任何可重复性(即通过SQL Mgmt Studio) - 是否有人知道这个问题?
我们当前的计划是分解并深入研究ASP端的代码,并直接从ASP完全单独调用Server 2.sproc2,而不是试图通过sproc1进行反馈。
答案 0 :(得分:3)
您是否在两个存储过程中都设置了设置nocount ?我有一个类似的问题,虽然我不记得我此刻是如何解决的,但我知道这与它有关!
答案 1 :(得分:1)
您可能会受到double-hop problem
的影响双跳问题是当ASP / X页面尝试使用位于与IIS服务器不同的服务器上的资源时。
Windows NT质询/响应does not support双跳模拟(在传递到IIS服务器后,无法将相同的凭据传递给后端服务器进行身份验证)。
您应该使用SQL事件探查器验证尝试的第二次连接。
请注意,通过手动测试,您无法通过IIS进行身份验证。只有当您通过ASP / X页面启动sql时才会出现此问题。
更多资源:
答案 2 :(得分:1)
我遇到了类似的问题,我通过设置nocount并删除打印命令解决了这个问题。
答案 3 :(得分:0)
示例代码可能有帮助:)您是否尝试从存储过程返回两个表;我不认为ADO 2.6可以处理多个返回的表。
答案 4 :(得分:0)
我确实考虑过(双跳),但是我所指的sproc-in-a-sproc调用与通过INNER JOIN进行的典型跨服务器连接之间的区别是什么?两者都将在Server1上执行,使用链接服务器凭据,并对服务器2进行身份验证。
任何人都可以确认调用sproc跨服务器与在数据表上进行连接不同吗?为什么?
如果链接服务器配置是一个sql帐户 - 被认为是双跳(因为你所指的是NTLM双跳?)
就多个结果集是否会回来而言 - 没有。 Server1.Sproc1和Server2.Sproc2在.net世界中都是“ExecuteNonQuery()”并且不返回任何内容(没有结果集,也没有返回值)。
答案 5 :(得分:0)
尝试检查连接字符串中指定的用户对数据库的权限。 使用sql mgmt studio时,在连接字符串中使用相同的用户名登录数据库。
创建一些临时表来编写中间值和异常,因为它可以是调试应用程序的有效方法。
答案 6 :(得分:0)
我可以检查一下:你加入了sproc2吗?在此之前,它的工作时间很长。
你能不能改变你从哪里调用sproc2?而不是从sproc1内部调用它,你可以从ASP调用它吗?这样您就可以在代码中控制对SQL的身份验证,而不必依赖于在服务器上设置任何信任或共享远程身份验证。
答案 7 :(得分:0)
您的链接服务器是如何设置的?您通常可以选择如何对远程服务器进行身份验证,包括以当前登录用户身份登录或指定始终使用的SQL登录。您是否尝试将其设置为始终使用特定帐户?这应该消除调用远程过程中的任何可能的权限问题...
答案 8 :(得分:0)
我的第一个反应是,这可能不是调用跨服务器的问题,而是从第一个调用第二个proc,而 this 可能是两个不同的行为。环境。
我的第一个问题是:如果从等式中删除跨服务器方面会发生什么?如果您可以设置一个测试系统,其中您的第一个proc调用第二个proc,但第二个proc位于同一服务器和/或同一个数据库中,您是否仍会遇到相同的问题?
沿着同样的路线:根据我的经验,当应用程序和SSMS得到不同的结果时,它通常是存储过程设置的问题。正如卢克所说,它可能是NOCOUNT。我有这种事情发生在代码中无关的PRINT语句中,虽然我似乎记得PRINTed值成为错误描述的一部分(非常违反直觉)。
如果
最后一个想法:如果是环境问题,请在ASP页面的连接字符串上尝试不同的设置。例如,如果您有OLEDB连接,请尝试ODBC。尝试本机和非本机SQL Server驱动程序。查看您的提供商支持的连接字符串选项,并尝试其中任何看起来可能值得尝试的选项。