Мне трудно выполнить хранимую процедуру 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 ()
. Но по какой-то причине с хранимыми процедурами ему не понравилось это соглашение об именах.
Спасибо.