У меня есть несколько хранимых процедур в приложении, которые работали идеально (в течение многих лет) до нашего недавнего обновления с 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] [Драйвер JDBC SQLServer] [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] [Драйвер JSBC SQLServer] [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````