Вывод индекса из диапазона при попытке вызвать хранимую процедуру

#java #sql #sql-server #stored-procedures #resultset

#java #sql #sql-сервер #хранимые процедуры #набор результатов

Вопрос:

У меня есть запрос, который должен получить 2 параметра «tinyint» для запуска, и я превратил его в хранимую процедуру.

хранимая процедура в sql выглядит следующим образом:

 Create Procedure query3
@X tinyint = null,
@Y tinyint = null
AS
BEGIN
SELECT T.tressure_No as 'Treasure Number', T.tressure_Name as 'Treasure Name' , COUNT( DISTINCT U.user_detail_Name) as numOfUsers

FROM dbo.tblUser AS U INNER JOIN dbo.tblTressure AS T
     ON U.country_id_user = T.country_Hidden_Code
     INNER JOIN dbo.tblListContains AS LC
     ON T.tressure_No = LC.tressure_No 
     AND LC.user_name_detail = U.user_detail_Name

WHERE U.user_detail_Name  IN(SELECT  LC.user_name_detail
                             FROM dbo.tblListContains AS LC
                             WHERE T.tressure_No = LC.tressure_No AND LC.user_name_detail NOT IN (SELECT LF.user_detail_Name
                                                                                                  FROM dbo.tblLookingFor AS LF
                                                                                                  WHERE LF.tressure_No = T.tressure_No
                                                                                                  AND LF.user_detail_Name = U.user_detail_Name)
                             GROUP BY LC.user_name_detail, LC.tressure_No
                             HAVING COUNT( LC.num_Of_List_User)>=@Y)


GROUP BY T.tressure_No, T.tressure_Name
Having COUNT( DISTINCT U.user_detail_Name)>=@X;
END
 

Когда я тестирую хранимую процедуру в моем 2008 SQLEXPRESS server R2 manager, она работает просто отлично, и запрос внутри результата возврата соответствует ожидаемому.
но когда я пытаюсь вызвать его из своего JAVA GUI, он летит к черту…
вот код Java (этот метод вызывается внутри моего графического интерфейса для заполнения таблицы результирующим набором):

 public ResultSet getQuery3Results(byte numOfUsers, byte numberOfLists){
        ResultSet rs = null;
        try{
            Class.forName(server);
            System.out.println("here1");
            conn = DriverManager.getConnection(LINK);
            String callStatement = "{call query3(?,?)}";
            pst.setByte(1, numOfUsers);
            pst.setByte(2, numberOfLists);
            System.out.println("here2");
            pst = conn.prepareCall(callStatement);
            rs = pst.executeQuery();
            return rs;
        }
        catch (SQLException ex){
            ex.printStackTrace();
            rs = null;
            return rs;
        }
        catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        return rs;
    }
 

Я получаю эту трассировку стека исключений:

 com.microsoft.sqlserver.jdbc.SQLServerException: The index 1 is out of range.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setterGetParam(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setByte(Unknown Source)
    at View.ViewLogic.getQuery3Results(ViewLogic.java:1170)
    at View.ViewLogic.handleGenerateQuery3Button(ViewLogic.java:1641)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.Trampoline.invoke(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(Unknown Source)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(Unknown Source)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
    at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
    at javafx.event.Event.fireEvent(Unknown Source)
    at javafx.scene.Node.fireEvent(Unknown Source)
    at javafx.scene.control.Button.fire(Unknown Source)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
    at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
    at javafx.event.Event.fireEvent(Unknown Source)
    at javafx.scene.Scene$MouseHandler.process(Unknown Source)
    at javafx.scene.Scene$MouseHandler.access$1500(Unknown Source)
    at javafx.scene.Scene.impl_processMouseEvent(Unknown Source)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
    at com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
    at com.sun.glass.ui.View.notifyMouse(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
 

Я понятия не имею, что я делаю не так, предложения и предложения приветствуются: D

Том

Комментарии:

1. 2 параметра tinyint — это не то же самое, что два переданных байта.

2. вы не можете передать tinyint из java, потому что этот тип не существует в java, но если вы передаете байт с помощью метода setByte(), он преобразует значение байта в tinyint обратно в sql-server. это просто чтение описания метода setByte().

Ответ №1:

Эта строка должна выполняться перед установкой значений

 pst = conn.prepareCall(callStatement);
 

Кроме того, вы должны убедиться, что передаете соответствующие типы данных в соответствии с правилами сопоставления Microsoft. https://msdn.microsoft.com/en-us/library/ms378878 (v=sql.110).aspx

 conn = DriverManager.getConnection(LINK);
String callStatement = "{call query3(?,?)}";
pst.setShort(1, numOfUsers);
pst.setShort(2, numberOfLists);
 

Комментарии:

1. Спасибо, это помогло!!