我正在开发/维护传统的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和DbClose将分配
objRec
和objConn
并连接到从服务器(这里SqlServer的)/断开。
更新和解决方案
我也问过我提供这个解决方案的人创造一个答案,所以我可以给他适当的upvotes,但在此期间,我将在这里提出的解决方案。
随着第一条语句如果
存储过程我已经加入
SET NOCOUNT这似乎是招得到它的工作。
我还没有找到为什么这是必要的(从技术角度来看),只是包括set nocount on
将加快存储过程,但最后我再次运行存储过程与经典ASP组合!
究竟什么不行?你有例外吗?一个可能的解释可能是,Win7运行IIS7,它在“集成模式”,不完全兼容IIS6 – Andomar
@Andomar:我这样说:对'objRec.Close'的调用给出一个'操作是不允许的,当对象是closed.'消息,表示'objRec.Open ...'调用没有成功。 – Edelcom
尝试在存储过程的顶部添加'set nocount on'? – Andomar