我使用"Microsoft本机客户端11.0“从经典ASP调用Server存储过程。我这么做已经好几年了。我刚刚开发了一个存储过程,它使用PRINT语句在开发期间以及从MSSMS调用时提供信息信息。但是,当我通过SQL Server本机客户端从Classic调用相同的存储过程时,在错误代码中出现的第一个PRINT语句中的文本会出现0x80040e14错误。
我在谷歌上搜索过这个问题,但在哪里都找不到它说你不能这么做的地方,所以我想知道我是不是错过了一个窍门。谁能给我指出我不能包括打印声明的证据(嘘!)还是我在做傻事?
异常:
http ://localhost:3000/DataAccess/Workpalces.asp中第71行第3列中未处理的异常 0x80040e14 - Microsoft本机客户端11.0:
My (简写)存储过程:
CREATE PROCEDURE Assessment.RefreshUP
@OrgID int,
@UserID int = NULL,
@BaseDate smalldatetime = NULL
AS
BEGIN
SET NOCOUNT ON
DECLARE @Error int
DECLARE @RowCount int
BEGIN TRY
PRINT '---- START Assessment.RefreshUP ----'
(snip)我的经典ASP调用:
' Assessment.RefreshUP
' ========================
' Creates or updates a Workplace
Function Assessment_RefreshUP(rs, OrganisationID, UserID)
Stop
Dim cmd
Set cmd = Server.CreateObject("ADODB.Command")
Set rs = Server.CreateObject("ADODB.Recordset")
cmd.ActiveConnection = DBConnString
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "Assessment.RefreshUP"
cmd.Parameters.Append cmd.CreateParameter("@OrgID", adInteger, adParamInput, 0, OrganisationID)
cmd.Parameters.Append cmd.CreateParameter("@UserID", adInteger, adParamInput, 0, UserID)
' cmd.Parameters.Append cmd.CreateParameter("@BaseDate", adDate, adParamInput, 0, Null)
rs.CursorLocation = adUseClientBatch
rs.Open cmd, , adOpenStatic, adLockReadOnly
Set rs.ActiveConnection = Nothing
Set cmd = Nothing
End Function发布于 2014-03-12 11:42:22
通过查看异常代码(0x80040e14),而不依赖异常文本(“-启动Assessment.RefreshUP -”),可以找到问题的根源。
在我的例子中,问题是对存储过程中不存在的用户定义函数(UDF)的调用。然而,打印语句的存在影响了异常“文本”,并导致我走错了道路。
可以在存储过程中使用打印语句,这些语句是从经典ASP / Server本机客户端调用的。
如果遇到问题,请尝试直接从MSSMS调用存储过程,最好使用从source捕获的SQL来确定问题的真正来源。
发布于 2014-03-12 10:06:46
PRINT语句对于调试非常有用,但是遇到这些问题后,我发现在存储过程中增加一个类似于@debug TINYINT = 0的参数对于在默认情况下不显示PRINT语句或调试输出很有用,但允许您在想调试过程时打开它。
CREATE PROCEDURE Assessment.RefreshUP
@OrgID int,
@UserID int = NULL,
@BaseDate smalldatetime = NULL,
@Debug tinyint = 0
AS
BEGIN
SET NOCOUNT ON
DECLARE @Error int
DECLARE @RowCount int
BEGIN TRY
IF (@debug = 1) PRINT '---- START Assessment.RefreshUP ----'
(snip)在某些情况下,也更喜欢使用RAISERROR,因为它允许您传递多个参数,比如String.Format()在.Net中的工作方式。
https://stackoverflow.com/questions/22347765
复制相似问题