首页 > 解决方案 > 在 ColdFusion 2016 中将太多参数传递给存储过程时遇到问题

问题描述

在我们最近从 ColdFusion 2010 升级到 ColdFusion 2016 之前,我在一个应用程序中有几个运行良好的存储过程(多年来)。现在,我收到错误消息,要么参数太多,要么某个参数不是参数不包含在被调用的过程中。

我选择上传一些代码,以便人们更好地了解实际发生的情况。仍在学习如何在这里格式化代码,所以如果仍然缺乏,请原谅我。

在这两种情况下,我都在过程调用中仔细检查了存储过程中的参数列表,发现它们确实都是正确的。事实上,5 年多来这段代码没有任何改变。此行为仅在升级发生后才开始。

下面是第一个例子。我将首先列出过程调用(在 cfscript 中),然后是存储过程中的参数列表,然后是它产生的错误消息:

public query function readStorage(numeric group1=0,numeric group2=0) {  
     local.group1Value = arguments.group1?arguments.group1:"";  
     local.group2Value = arguments.group2?arguments.group2:"";  
     spService = new storedproc();   
     spService.setDatasource(variables.dsn);  
     spService.setUsername(variables.userName);  
     spService.setPassword(variables.password);   
     spService.setProcedure("usp_readCompatibilityStorage");
     spService.addParam(dbvarname="@group1Id",cfsqltype="cf_sql_integer"
           , type="in",value=local.group1Value,null=!arguments.group1);  
     spService.addParam(dbvarname="@group2Id",cfsqltype="cf_sql_integer"
          ,type="in",value=local.group2Value,null=!arguments.group2);  
     spService.addProcResult(name="rs1",resultset=1);  

     local.result = spService.execute();   

     return local.result.getProcResultSets().rs1;   
}  

以下是存储过程中的参数列表:

 @groupId1  int = NULL        
,@groupId2  int = NULL

以下是我收到的错误消息:

[Macromedia][SQLServer JDBC 驱动程序][SQLServer]@group1Id 不是过程 usp_readCompatibilityStorage 的参数。

第二个例子:

public query function read(string cribIdList="",  
                        numeric cribNumber=0,  
                        string isAnnex="",  
                        numeric siteId=0,  
                        string parentCribIdList="",  
                        numeric supervisorId=0,  
                        numeric statusId=0,  
                        string orderBy="cribNumber ASC") {  

    local.cribNumberValue = arguments.cribNumber?arguments.cribNumber:"";  
    local.siteIdValue = arguments.siteId?arguments.siteId:"";  
    local.superIdValue = arguments.supervisorId ? arguments.supervisorId:"";  
    local.statusIdValue = arguments.statusId ? arguments.statusId:"";  

    spService = new storedproc();   
    spService.setDatasource(variables.dsn);  
    spService.setUsername(variables.userName);  
    spService.setPassword(variables.password);   
    spService.setProcedure("usp_readCrib");   

    spService.addParam(dbvarname="@cribIdList",cfsqltype="cf_sql_varchar"
        ,type="in",value=arguments.cribIdList
        ,null=!len(arguments.cribIdList));  
    spService.addParam(dbvarname="@cribNumber",cfsqltype="cf_sql_integer"
         ,type="in",value=local.cribNumberValue
         ,null=!arguments.cribNumber);   
    spService.addParam(dbvarname="@isAnnex",cfsqltype="cf_sql_varchar"
        ,type="in",value=arguments.isAnnex,null=!len(arguments.isAnnex));  
    spService.addParam(dbvarname="@siteId",cfsqltype="cf_sql_integer"
         ,type="in",value=local.siteIdValue,null=!arguments.siteId);  
    spService.addParam(dbvarname="@parentCribIdList" 
         , cfsqltype="cf_sql_varchar", type="in"
         , value=arguments.parentCribIdList
         , null=!len(arguments.parentCribIdList));  
    spService.addParam(dbvarname="@supervisorId", 
         cfsqltype="cf_sql_integer", type="in",value=local.superIdValue
         , null=!arguments.supervisorId);  
    spService.addParam(dbvarname="@statusId"
         , cfsqltype="cf_sql_integer", type="in"
         , value=local.statusIdValue, null=!arguments.statusId);        
    spService.addParam(dbvarname="@orderBy",cfsqltype="cf_sql_varchar"
         , type="in",value=arguments.orderBy);  
    spService.addProcResult(name="rs1",resultset=1);  

    local.result = spService.execute();  

    return local.result.getProcResultSets().rs1;   
}  

以下是存储过程中的参数列表:

@cribIdList         varchar(500) = NULL  
,@cribNumber        int = NULL  
,@isAnnex           varchar(3) = NULL  
,@siteId            int = NULL  
,@parentCribIdList  varchar(500) = NULL  
,@supervisorId      int = NULL  
,@statusId          int = NULL  
,@orderBy           varchar(50)  

以下是从服务器返回的消息:

[Macromedia][SQLServer JDBC 驱动程序][SQLServer]过程或函数 usp_readCrib 指定的参数过多。

在这两个错误的情况下,它们似乎发生在以下路径:

Error Details - struct
COLUMN      0
ID          CFSTOREDPROC
LINE        489
RAW_TRACE   at cfbase2ecfc235349229$funcINVOKETAG.runFunction(E:\ColdFusion2016\cfusion\CustomTags\com\adobe\coldfusion\base.cfc:489)
TEMPLATE    E:    \ColdFusion2016\cfusion\CustomTags\com\adobe\coldfusion\base.cfc
TYPE    CFML````

标签: sql-serverstored-proceduresparameterscoldfusioncoldfusion-2016

解决方案


ColdFusion 10 及更高版本默认将请求中的参数数量限制为 100。幸运的是,这可以更新和更改以反映存储过程所需的参数数量。

ColdFusion 管理员的屏幕截图


推荐阅读