Возникла проблема с передачей слишком большого количества параметров хранимым процедурам в ColdFusion 2016 - PullRequest
1 голос
/ 13 июня 2019

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

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Мы столкнулись с похожими проблемами с унаследованным приложением при обновлении с 10 до 2016 года. Без нашего ведома предыдущий разработчик использовал dbvarname и неправильно написал некоторые из имен параметров хранимых процедур.Это никогда не было проблемой в CF10, потому что тогда атрибут dbvarname игнорировался.Приходит CF11, где Adobe решает воскресить "dbvarname" .Поэтому, как только мы обновили, унаследованный код начал выдавать всевозможные ошибки, пока мы не исправили имена параметров.

В любом случае, именно это и вызывает "X не является параметром для процедуры Y" ошибка.Имена параметров хранимой процедуры написаны с ошибками.Код cfscript использует:

@group1Id 

.. но имя, определенное в хранимой процедуре, пишется иначе (обратите внимание, что «1» находится в конце, а не в середине).

 @groupId1 

Что касается ошибки «слишком много параметров» , то она также может быть связана.Однако я запустил ваш код для второй хранимой процедуры без ошибок, как в CF2016, так и в 2018. Поэтому я бы предложил еще раз проверить имена параметров хранимой процедуры, поскольку ошибка предполагает, что они отличаются от того, что было опубликовано.

Проверка хранимой процедуры

CREATE PROCEDURE  [dbo].[usp_readCrib] 

@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) 
AS
BEGIN
    SELECT getDate() AS SampleResult 
END
GO
0 голосов
/ 18 июня 2019

ColdFusion 10 и выше ограничивают количество параметров в запросе до 100 по умолчанию.К счастью, это можно обновить и изменить, чтобы отразить необходимое количество параметров, необходимых для хранимых процедур.

Screen shot of ColdFusion Administrator

...