sql-server - 在 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````
解决方案
推荐阅读
- r - 如何修复“变量'cbind(Y1,Y2,Y3,Y4)'的无效类型(列表)”
- amazon-web-services - 上传到 S3 存储桶,导致 ECS 实例拒绝访问
- python - pyramid.arima.auto_arima 可以自动检测季节性并返回 p,q,d 如果非季节性和 P,Q,D 如果季节性?
- javascript - 即使设置了新数组,Vuetify 2 - 10 也会出现在分页选项中
- android - Intent 用于 Android 上的过温恢复
- excel - 匹配另一个范围的条件格式范围
- sonarqube - 如何将 NCover 与 SonarQube 一起使用
- websocket - 如何在环回 4 的 RestApplication 中使用 socket.io?
- python - 数值求解非线性方程 - Python
- python - 为什么我的一段代码没有按顺序执行?