Большое спасибо. Я использую JSP, однако. Тем не менее, главное - вернуть данные таблицы и манипулировать ими в 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}");
И ничего не сработало. Как только я смогу это сделать, я смогу запустить фактическую хранимую процедуру, которая возвращает данные таблицы из оператора select. Но я даже не могу заставить эту фиктивную хранимую процедуру работать.
Что я здесь не так делаю?
Спасибо.
Обновить:
Проверил журналы сервера (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()
, Но по какой-то причине с хранимыми процедурами не понравилось это соглашение об именах.
Спасибо.