Как выполнить хранимую процедуру MS SQL Server в java / jsp, возвращая данные таблицы?

Мне трудно выполнить хранимую процедуру MS SQL Server из Java / jsp. Я хочу вернуть набор данных таблицы; последняя строка хранимой процедуры - это обычный оператор выбора из таблицы.

(С этого момента выполнение хранимой процедуры является простой задачей в PHP .)

Я посмотрел на них сайты для справки:
www.2netave.com
www.stackoverflow.com

Я не понимал, что есть функция только для хранимых процедур, так как вместо этого использовал createStatement () .

Теперь, пожалуйста, поймите, что хранимая процедура отлично выполняется в SQL Server Management Studio, и у меня не было проблем с выполнением специальных запросов в jsp / java с помощью createStatement () .

Я создал простую хранимую процедуру, которая не принимает аргументов, просто чтобы сузить проблему:

CREATE PROCEDURE sp_test AS
BEGIN
PRINT 'HELLO WORLD'
END

Вот код на моей странице jsp:

Class.forName("net.sourceforge.jtds.jdbc.Driver");
java.sql.Connection conn = java.sql.DriverManager.getConnection("jdbc:jtds:sqlserver://MySQLServer:1433/test", "user", "pass");
java.sql.CallableStatement cs = conn.prepareCall("{call sp_test}"); 
java.sql.ResultSet ResultSet = cs.execute();

Браузер сообщает мне, что страница не может быть отображена из-за ошибки внутреннего сервера. Я знаю, что это означает, что есть проблема с приведенным выше кодом.

Я пробовал это:

java.sql.ResultSet ResultSet = cs.executeQuery();

И это:

java.sql.CallableStatement cs = conn.prepareCall("{execute sp_test}");

И это:

java.sql.CallableStatement cs = conn.prepareCall("{exec sp_test}");

И ничего не сработало. Как только я смогу заставить это работать, я могу запустить фактическую хранимую процедуру, которая возвращает данные таблицы из оператора выбора. Но я даже не могу заставить эту фиктивную хранимую процедуру работать.

Что я здесь делаю не так?

Спасибо.

Обновление:

Проверил журналы сервера (IIS) и мой HTTP-прокси, fiddler, и он ни о чем не сообщает. Однако IIS использует tomcat в качестве механизма сервлетов для страниц jsp. И файл журнала tomcat сообщил следующее:

An error occurred at line: 20 in the jsp file: /test.jsp
Type mismatch: cannot convert from boolean to ResultSet
17: 
18:     java.sql.CallableStatement cs = conn.prepareCall("{call sp_test}");
19:     
20:     java.sql.ResultSet ResultSet = cs.execute();
21: 
22: //  java.sql.ResultSet ResultSet = state.executeQuery(SQL); 
23: 

Я попытался изменить приведенное выше на:

cs.execute();

И файлы журнала сообщили:

- Servlet.service() for servlet jsp threw exception
java.sql.SQLException: The EXECUTE permission was denied on the object 'sp_test', database 'test', schema 'dbo'.

Итак, Я понял, что мне нужно GRANT EXECUTE пользователю. Другая проблема - это возврат данных таблицы из хранимой процедуры.

Если у меня есть такая процедура:

CREATE PROCEDURE sp_test2 AS
BEGIN
SELECT * FROM TABLE
END

Как мне управлять данными таблицы в jsp? Будет ли ResultSet работать или это только для специальных запросов, в отличие от хранимых процедур, где можно использовать createStatement () для выполнения запроса?

Спасибо.

Update2:

Решение:

Чтобы управлять данными таблицы, мне пришлось использовать следующее:

java.sql.ResultSet RS = cs.executeQuery();

Не удалось выполнить execute () , и не удалось присвоить имя ResultSet объект ResultSet. Раньше он никогда не жаловался на это с помощью createStatement () . Но по какой-то причине с хранимыми процедурами ему не понравилось это соглашение об именах.

Спасибо.

26
задан Community 23 May 2017 в 12:34
поделиться