2011-11-24 91 views
1

我正在开发/维护传统的ASP页面和ASP代码从sqlserver的/快递2008/R2取数据在Windows 7 PC上。调用存储过程在传统的ASP失败时,存储过程的INSERT或UPDATE表

在此代码中,我使用存储过程登录到网站。

  • 如果登录ID和密码组合正确,则使用UPDATE或INSERT更新某些表。

  • 如果登录ID或密码不正确,则不会发出日志记录(因此没有更新表)。

的结果集被返回与这两种情况下的某些字段(具有字段设置为-1或取决于登录ID和密码的正确性内部用户NR)。

我已经使用这个相同的例程超过5年了,运行在各种IIS服务器和各种Sqlservers上。

该工作在其他IIS/Sqlservers组合上的代码在我的开发PC上不起作用。

任何想法为什么?

由于它是一个开发环境,我使用sqlserver SA帐户和相应的密码。据我所知,这个SA用户应该拥有所有适当的权利。

要完成我现在会给例程(但你会看到它是非常简单的):显示

function DoLogon(byval psNickName, byval psPassword) 

    dim sSql 

    DoLogon = False 

    psNickName = Trim(psNickName) 
    psPassword = Trim(psPassword) 

    if (psNickName = "") then exit function 
    if (psPassword = "") then exit function 

    ' on error Resume Next 

    call DbOpen 

    sSql = "exec sp_EcomLogon " & SqlString(psNickName) & "," & _ 
           SqlString(psPassWord) & "," & _ 
           SqlString(Request.ServerVariables("REMOTE_ADDR")) & "," & _ 
           Trim(cStr(Session.SessionId)) 

    objRec.Open sSql ,objConn ' ,adOpenStatic,adLockReadOnly ,adCmdText 

    Klant_NetId = FldDft("K_NetId",-1) 

    Call SetVarValue(cKlant_NetId,Klant_NetId) 
    objRec.Close 
    call DbClose 

    if Klant_NetId <> -1 then 
     DoLogon = True 
     Klant_IsLoggedOn = 1 
    else 
     DoLogon = False 
     Klant_IsLoggedOn = 0 
    end if 
    call SetVarValue(cKlant_IsLoggedOn, Klant_IsLoggedOn) 

    end function 

以下错误时objRec.Close线存在:

ADODB.Recordset error '800a0e78' 

Operation is not allowed when the object is closed. 
  • select * from ...替代exec sp_...的作品。所以我认为它自己的代码是正确的。

  • DbOpen和DbClos​​e将分配objRecobjConn并连接到从服务器(这里SqlServer的)/断开。

更新和解决方案

我也问过我提供这个解决方案的人创造一个答案,所以我可以给他适当的upvotes,但在此期间,我将在这里提出的解决方案。

随着第一条语句如果

存储过程我已经加入

SET NOCOUNT这似乎是招得到它的工作。

我还没有找到为什么这是必要的(从技术角度来看),只是包括set nocount on将加快存储过程,但最后我再次运行存储过程与经典ASP组合!

+0

究竟什么不行?你有例外吗?一个可能的解释可能是,Win7运行IIS7,它在“集成模式”,不完全兼容IIS6 – Andomar

+0

@Andomar:我这样说:对'objRec.Close'的调用给出一个'操作是不允许的,当对象是closed.'消息,表示'objRec.Open ...'调用没有成功。 – Edelcom

+0

尝试在存储过程的顶部添加'set nocount on'? – Andomar

回答

3

尝试将set nocount on添加到存储过程的顶部?

0

我遇到了类似的问题,在我的情况下,问题是我选择的表上的权限。我没有选择权限,它会关闭连接。现在您提到您使用的是sa帐户,因此它应该具有所有功能的权限,但我会仔细检查以确保这是真实的。 HTH

韦德

+0

在此处提问之前,请双击此选项。在数据库客户端程序中执行'exec sp _...',起作用。 – Edelcom

+0

@edelcom这个错误很糟糕,因为它从来没有向你显示正确的错误。我可以假设你也查看了SQL Server日志以查看是否有任何错误? – Wade73

2

这可能是因为您访问该存储过程与错误执行。我建议你写出字符串sSql来屏幕复制并在查询分析器中执行以排除故障。

+0

SQL是正确的,我总是调试(Response.Write)我的查询,以防万一。在数据库程序(我使用数据库工作台)中执行确切的查询是有效的。我必须与权限有关,但由于我已经在使用sa帐户,所以我没有看到问题出在哪里。 – Edelcom

+1

尝试使用Profiler如Anj Profiler http://anjlab.com/en/projects/opensource/sqlprofiler来分析数据库调用,以查看哪个帐户正在执行存储过程等。 –

+0

+1提到profiler。这至少验证是否符合使用正确的帐户来运行storec过程并且存储过程的语法是正确的。进一步调查后,我发现在几个程序的顶部放置'set nocount'是必需的。不知道为什么,但解决了这个问题。我曾问过@Andomar(谁提供这个解决方案作为评论),以便将他的评论作为答案。 – Edelcom