【问题标题】:Execute SQL Stored procedure in Classic ASP在经典 ASP 中执行 SQL 存储过程
【发布时间】:2026-02-20 19:40:01
【问题描述】:

下面是ASP页面,这个页面的onload我需要执行一个存储过程。我需要将一个参数传递给这个存储过程。我从会话中获得的这个参数的值。存储过程应该将记录插入表中,我不需要它返回任何值。 无论我做什么,我都无法从 ASP 页面执行它。请帮忙。 我在这里做错了什么?

<% @Language=VBScript %>
<%Response.Buffer = true%>

<html>
<head>
</head>

<body>
<!--#include file = "connect.txt" -->    
<!--#include file= "adovbs.inc" -->

<%
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command") 

'this will be my parameter
Dim strID
strID = Session("ID")

ConnectionStr =       "Provider=SQLOLEDB;Server=***;Database=***;Uid=***;Pwd=***;"
conn.Open  ConnectionStr

With cmd
.ActiveConnection = conn
.CommandType = adCmdStoredProc
.CommandText = "sp_Application_Insert"
.Parameters.Append cmd.CreateParameter("@TUID ", adVarchar, adParamInput, 200, strID)
.Execute


End With
Set cmd = Nothing
conn.close 
%>

</body>
</html>

【问题讨论】:

  • 人家还在写经典的asp代码?马修飓风是否让我们陷入了时间扭曲?我不是要刻薄......现在这是恐龙技术。
  • @granadaCoder 是的......有些人仍然这样做。当然有些人还在使用 sql server 2000(甚至更早的版本)。这并不意味着这是一件好事。 :)
  • 稍微绕开这个问题。您确实应该避免使用 sp_ 前缀,或者更好的是,完全避免使用该前缀。 sqlperformance.com/2012/10/t-sql-queries/sp_prefix
  • 为了一切正常,您需要更改连接包含文件的文件扩展名,因为大多数网站通常允许使用 txt 扩展名。这意味着有人得到一个列出您的网络服务器的文件,除非您明确禁止将 txt 扩展名作为允许的文件类型,否则您的网络服务器将尽职地将该文件提供一个 http 附件。将其更改为默认禁止的.inc。
  • 你怎么知道它没有执行?您是否在 sql server 上运行了配置文件会话?该表上是否有一个触发器可能由于错误而静默回滚插入?

标签: sql-server stored-procedures vbscript asp-classic


【解决方案1】:
  1. 您应该验证参数.....它是否存在,以及它对于预期数据类型的正确值
  2. 您需要某种错误警报/日志记录。以下是您修改的代码。

  3. 混用ADODB.Connection代码(数据层)和html/asp(表示层)让我眼睛疼。

我在下面所做的更改来自

https://support.microsoft.com/en-us/kb/300043

<% @Language=VBScript %>
<%Response.Buffer = true%>

<html>
<head>
</head>

<body>
<!--#include file = "connect.txt" -->    
<!--#include file= "adovbs.inc" -->

<%
On Error Resume Next
Set conn = Server.CreateObject("ADODB.Connection")
Set cmd = Server.CreateObject("ADODB.Command") 

'this will be my parameter
Dim strID
strID = Session("ID")

ConnectionStr =       "Provider=SQLOLEDB;Server=***;Database=***;Uid=***;Pwd=***;"
conn.Open  ConnectionStr

With cmd
.ActiveConnection = conn
.CommandType = adCmdStoredProc
.CommandText = "sp_Application_Insert"
.Parameters.Append cmd.CreateParameter("@TUID ", adVarchar, adParamInput, 200, strID)
.Execute

if Err.Number <> 0 then

  Response.Write "An Error Has Occurred on this page!<BR>"
  Response.Write "The Error Number is: " & Err.number & "<BR>"
  Response.Write "The Description given is: " & Err.Description & "<BR>"

'' you can try the below too
'    Set objASPError = Server.GetLastError

 '   response.write "Category: " & objASPError.Category & _
  '   "ASPCode: " & objASPError.ASPCode & _
   '  "Number: " & objASPError.Number & _
    ' "ASPDescription: " & objASPError.ASPDescription & _
    ' "Description: " & objASPError.Description & _
    ' "Source: " & objASPError.Source

end if


End With
Set cmd = Nothing
conn.close 
%>

</body>
</html>

追加

https://msdn.microsoft.com/en-us/library/ms345484.aspx

GRANT EXECUTE ON OBJECT::dbo.sp_Application_Insert
    TO ***; /* where *** is your uid value in your connection string that you did not show */

【讨论】:

  • 谢谢。当我最终让这个 proc 执行时,我不会在我的代码中使用连接字符串。最初我只是使用 con.Open,我知道它可以工作,因为我可以执行 con.Open rs.Open "SELECT ID_ID FROM Person where ix_National_ID = '" & strStudentID & "'", con, adOpenKeyset, adLockOptimistic
  • 感谢您提供错误代码,我得到了 Permission denied to execute 错误。此页面出现错误!错误号是:-2147217911 给出的描述是:对象“Application_Insert”、数据库“DBName”、架构“dbo”的执行权限被拒绝。
  • 现在你知道出了什么问题。见msdn.microsoft.com/en-us/library/ms345484.aspx
  • 谢谢@granadaCoder,设置好所需权限后,存储过程终于执行了。
  • SOF (*) 礼仪是将答案(最有帮助的)标记为“答案”。这样,问题就不再显示在“尚未回答”过滤页面下。
【解决方案2】:
Set OBC = Server.CreateObject("ADODB.Connection") 
OBC.Open "connection_string"
S = "CALL sp_application_insert(5)"
OBC.Execute(S)

其中 connection_string := 作为 ODBC 源给出的 ODBC 连接字符串; 5 代表任何数字参数的示例。取自工作 ASP 文件。

【讨论】:

    【解决方案3】:

    最终代码:

    Dim strStudentID
    Dim transactionId
    strStudentID = Session("ix_National_ID")
    transactionId = Session("transactionId")
    
    Session("accesslevel") = ""
    session("SessionStatus") = "5"
    
    
    
    
    Set cmd = server.createobject("ADODB.command")
    With cmd
    .ActiveConnection = con
    .CommandType = adCmdStoredProc
    .CommandText = "Temple_sp_Application_Insert"
    .Parameters.Append cmd.CreateParameter("@TUID ", adVarchar, adParamInput, 200, strStudentID)
    .Parameters.Append cmd.CreateParameter("@transactionId ", adVarchar,     adParamInput, 200, transactionId)
    .Execute
    
    if Err.Number <> 0 then
    
    Response.Write "An Error Has Occurred on this page!<BR>"
    Response.Write "The Error Number is: " & Err.number & "<BR>"
    Response.Write "The Description given is: " & Err.Description & "<BR>"
    
    
    
    end if
    
    
    End With
    Set cmd = Nothing
    Set Con = Nothing
    
    con.Close
    

    我收到以下错误,请注意错误描述末尾有 Session 变量 (strStudentID)。

    1. 我在生产服务器上遇到此错误 错误号是:-2147217911 给出的描述是:[Microsoft][SQL Server Native Client 11.0][SQL Server]915111111

    2. 此错误出现在非生产服务器上。 错误号是:-2147217911 给出的描述是:[Microsoft][ODBC SQL Server Driver][SQL Server]915111111

    【讨论】:

    • strID strStudentID.