ADO命令执行方法未填充ADO记录集

时间:2016-09-09 18:31:34

标签: vbscript asp-classic ado

我正在做一些清理,以防止在使用ASP的旧内部网站中发生SQL注入攻击。以下是代码中所有内容的要点......

数据库连接在名为connect.asp

的单独asp文件中设置
<%
on error resume next

Set DB = Server.CreateObject("ADODB.Connection")
DB.CommandTimeout = 180
DB.ConnectionTimeout = 180

connStr = "Provider=SQLOLEDB;Data Source=xxx-xxxx-xxxxxx;Initial Catalog=xxxx;Persist Security Info=True;User ID=xxxxx;Password=xxxxxxxxxxxx;"

DB.Open connStr

' Check DB connection and go to Error Handler is error exists
if DB.state=0 then
    Response.Write "<p>Cannot connect to database.</p>"
    TrapError Err.description
    Response.end
end if
%>

这样可以打开数据库连接。

我有一个名为DBFunctions.asp的文件,用于将映射函数排序到存储过程及其参数。我正在尝试使用下面的函数将ADO记录集返回到另一个asp前端页面。

Function GetFacilityByFID(fid)
    set rs = server.CreateObject("ADODB.Recordset")
    Set cmd = Server.CreateObject("ADODB.Command")
    Set cmd.ActiveConnection = DB
    cmd.CommandText = "GetFacilityByFID"
    cmd.CommandType = adCmdStoredProc
    cmd.Parameters.Append cmd.CreateParameter("@FID", adVarChar, adParamInput, 20)
    cmd("@FID") = fid
    Set rs =  cmd.Execute
    Set GetFacilityByFID = rs       
End Function

以下是来自调用前端asp页面的代码,facDetail.asp

<%

Dim FID, FCBI, Error
FID = Request("FID")
FCBI = Request("FCBI") 

' Check DB connection and go to Error Handler is error exists
if DB.state=0 then
    Response.Write "<p>Cannot connect to database.</p>"
    TrapError Err.description
    Response.end
else
    if FID then
        Set RS = GetFacilityByFID(FID) 
    elseif FCBI then
        Set RS = GetFacilityByFCBI(FCBI)
    end if

    if RS.EOF then
        Response.Write "<BR><p class=alert>No record found</p>"
        response.End
    end if
end if
%>

调用页面显示没有返回记录

enter image description here

但存储过程在SSMS中执行时有效。

更新了代码

这是GetFacilityByFID存储过程的SQL代码。

CREATE PROCEDURE [dbo].[GetFacilityByFID] 
    @FID varchar(20) 
AS
BEGIN
    SET NOCOUNT ON;

    SELECT [FAC_CBI_NBR]
  ,[FAC_ID]
  ,[FAC_TYPE]
  ,[FAC_SUBTYPE]
  ,[FAC_REGION]
  ,[FAC_COST_CENTER]
  ,[FAC_SUPPLY_CODE]
  ,[FAC_UPLINE]
  ,[FAC_SERVICE]
  ,[FAC_LOCATION_NAME]
  ,[FAC_LOCAL_ADDR1]
  ,[FAC_LOCAL_ADDR2]
  ,[FAC_LOCAL_CITY]
  ,[FAC_LOCAL_STATE]
  ,[FAC_LOCAL_ZIP]
  ,[FAC_MAIL_ADDR1]
  ,[FAC_MAIL_ADDR2]
  ,[FAC_MAIL_CITY]
  ,[FAC_MAIL_STATE]
  ,[FAC_MAIL_ZIP]
  ,[FAC_COUNTRY]
  ,[FAC_PHONE]
  ,[FAC_FAX]
  ,[FAC_MANAGER]
  ,[FAC_CONTACT]
  ,[FAC_CONTACT_PHONE]
  ,[FAC_CONTACT_EXT]
  ,[FAC_CONTACT_EMAIL]
  ,[FAC_COMMENTS]
  ,[FAC_CHANGED_BY]
  ,[FAC_LAST_UPDATE]
  ,[FAC_MAILOUT]
  ,[FAC_CONTRACTION]
  ,[FAC_PROPERTY_CODE]
  ,[FAC_ATTN_TO]
FROM [cbid].[dbo].[FACILITY] 
WHERE [FAC_ID]=@FID
END

GO    

谁能告诉我出了什么问题?我一直在看这个问题,并且对此感到沮丧。

任何帮助将不胜感激!

修改:

当前问题状态:从ADO提供商处获取以下信息

  

错误号:-2147217904错误描述:过程或函数'GetFacilityByFID'需要参数'@FID',这是未提供的。错误源:用于SQL Server的Microsoft OLE DB提供程序

4 个答案:

答案 0 :(得分:1)

您需要指定尺寸。

来自CreateParameter Method (ADO)

  

如果在 Type 参数中指定可变长度数据类型,则为   必须传递 Size 参数或设置   Size   参数对象的属性,然后将其附加到   参数集合;否则会发生错误。

cmd.Parameters.Append cmd.CreateParameter("@FID", adVarChar, adParamInput, Len(fid))

答案 1 :(得分:0)

在继续之前,首先要确认您的存储过程GetFacilityByFID是否实际返回Recordset?很可能它没有。如果它只返回单个字符串值,则应将Function GetFacilityByFID(fid)修改为如下所示:

Function GetFacilityByFID(fid)
    Set cmd = Server.CreateObject("ADODB.Command")
    Set cmd.ActiveConnection = DB
    cmd.CommandText = "GetFacilityByFID"
    cmd.CommandType = adCmdStoredProc
    cmd.Parameters.Append cmd.CreateParameter("@returnVal", adVarChar, adParamOutput, 255, "")
    cmd.Parameters.Append cmd.CreateParameter("@FID", adVarChar, adParamInput)
    cmd("@FID") = fid
    cmd.Execute
    GetFacilityByFID = cmd("@returnVal")
End Function

答案 2 :(得分:0)

我使用我发现的一些例子和一些LankyMart的建议重写了这个函数。谢谢大家的帮助。

这是工作代码......

 Function GetFacilityByFID(fid)

    Set rs = server.CreateObject("ADODB.Recordset")
    Set cmd = Server.CreateObject("ADODB.Command")
    Set cmd.ActiveConnection = DB
    cmd.CommandText = "GetFacilityByFID"
    cmd.CommandType = adCmdStoredProc
    cmd.CommandTimeout = 900
    set prm = cmd.CreateParameter("@FID",adVarChar, adParamInput, 20, fid)
    cmd.Parameters.Append prm
    rs.CursorLocation = adUseClient
    rs.Open cmd, , adOpenForwardOnly, adLockReadOnly
    Set GetFacilityByFID = rs

On Error GoTo 0   
End Function

答案 3 :(得分:-1)

您设置参数的方式看起来不对,请尝试这样做:

Dim param
Set param = cmd.CreateParameter("@FID", adVarChar, adParamInput)
cmd.Parameters.Append param
param.Value = fid

您可以在此处阅读更多内容:https://msdn.microsoft.com/pt-br/library/ms675860(v=vs.85).aspx

希望有所帮助