Sql server 在ColdFusion 2016中向存储过程传递的参数太多,存在问题
在我们最近从ColdFusion 2010升级到ColdFusion 2016之前,我在一个应用程序中有几个存储过程运行得非常好(多年)。现在,我收到的错误消息可能是参数太多,或者某个参数不在调用的过程中 我选择上传一些代码,这样人们可以更好地理解实际发生的事情。还在学习如何在这里格式化代码,所以请原谅我,如果它仍然缺乏 在这两种情况下,我都在过程调用中仔细检查了存储过程中的参数列表,发现它们确实都是正确的。事实上,在过去的5年里,该代码没有任何变化。此行为仅在升级后才开始 下面是第一个例子。我将列出过程调用(在cfscript中) 首先是存储过程中的参数列表,然后是它生成的错误消息:Sql server 在ColdFusion 2016中向存储过程传递的参数太多,存在问题,sql-server,stored-procedures,parameters,coldfusion,coldfusion-2016,Sql Server,Stored Procedures,Parameters,Coldfusion,Coldfusion 2016,在我们最近从ColdFusion 2010升级到ColdFusion 2016之前,我在一个应用程序中有几个存储过程运行得非常好(多年)。现在,我收到的错误消息可能是参数太多,或者某个参数不在调用的过程中 我选择上传一些代码,这样人们可以更好地理解实际发生的事情。还在学习如何在这里格式化代码,所以请原谅我,如果它仍然缺乏 在这两种情况下,我都在过程调用中仔细检查了存储过程中的参数列表,发现它们确实都是正确的。事实上,在过去的5年里,该代码没有任何变化。此行为仅在升级后才开始 下面是第一个例子。我
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
@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]@group1Id不是
程序usp\U 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;
}
下面是存储过程中的参数列表:
@groupId1 int = NULL
,@groupId2 int = NULL
@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````
ColdFusion 10及更高版本将请求中的参数数量默认限制为100。幸运的是,可以对其进行更新和更改,以反映存储过程所需的参数数量
ColdFusion 10及更高版本将请求中的参数数量默认限制为100。幸运的是,可以对其进行更新和更改,以反映存储过程所需的参数数量
从哪个版本升级?很难说没有看到任何代码。如果s.O.的代码太长,你能把一个小的演示过程和代码放在一起,或者在gist上发布一个代码示例吗。?在不知道更多的情况下,我会说我们在从10月升级到2016年时遇到了遗留应用程序的问题。我们不知道,遗留代码有一些错误的@dbvarname变量。这在CF10中不是问题,因为该参数被忽略。随着CF11的出现,Adobe重新恢复了
dbvarname
,代码开始抛出各种错误,直到我们更正了参数名。。。这是一个愚蠢的问题,但您是否100%确定所有参数都匹配,您调用了正确的存储过程并访问了正确的数据库?询问的原因是这些看起来像SQL Server错误消息。如果拼写错误或提供的参数太多,EXEC也会出现同样的错误:EXEC myProc@ErrorParamName=123
在第一个过程中,参数名称不匹配。CF代码使用@group1Id
(“1”在中间)-但过程使用“@groupId1”(“1”在末尾)。第二个过程在CF2016和2018下运行良好。你确定这些是参数吗?从哪个版本升级?很难说没有看到任何代码。如果s.O.的代码太长,你能把一个小的演示过程和代码放在一起,或者在gist上发布一个代码示例吗。?在不知道更多的情况下,我会说我们在从10月升级到2016年时遇到了遗留应用程序的问题。我们不知道,遗留代码有一些错误的@dbvarname变量。这在CF10中不是问题,因为该参数被忽略。随着CF11的出现,Adobe重新恢复了dbvarname
,代码开始抛出各种错误,直到我们更正了参数名。。。这是一个愚蠢的问题,但您是否100%确定所有参数都匹配,您调用了正确的存储过程并访问了正确的数据库?询问的原因是这些看起来像SQL Server错误消息。如果拼写错误或提供的参数太多,EXEC也会出现同样的错误:EXEC myProc@ErrorParamName=123
在第一个过程中,参数名称不匹配。CF代码使用@group1Id
(“1”在中间)-但过程使用“@groupId1”(“1”在末尾)。第二个过程在CF2016和2018下运行良好。你确定这些是参数吗?与邮政不同parameters@Ageax他注意到调用是在CF脚本中进行的,该脚本可能封装在一个函数中,该函数可以从CFM的post调用。这就是为什么我把这个扔了出去。是的,这是一个很好的猜测,但是POST限制是在目标脚本执行之前应用的。如果发现太多参数,则在执行任何CFML代码之前,请求将被中止。由于错误显然是由CFML代码引起的,这意味着请求通过了POST过滤器,问题是另外的。与邮政不同parameters@Ageax他注意到调用是在CF脚本中进行的,该脚本可能封装在一个函数中,该函数可以从CFM的post调用。这就是为什么我把这个扔了出去。是的,这是一个很好的猜测,但是POST限制是在目标脚本执行之前应用的。如果发现太多参数,则在执行任何CFML代码之前,请求将被中止。由于错误显然是由CFML代码引起的,这意味着请求通过了POST过滤器,问题是另外的。