一尘不染

如何在java / jsp中执行MS SQL Server存储过程,返回表数据?

jsp

我很难从Java / jsp执行MS SQLServer存储过程。我希望返回一个表数据集;存储过程的最后一行是来自表的常规select语句。

(从这一点来看,执行存储过程很困难PHP。)

我没有意识到有一个功能仅用于存储过程,就像我正在使用的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页面的servlet引擎。并且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()用于执行查询的存储过程?

谢谢。

更新2:

解:

为了操作表数据,我必须使用以下命令:

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

它失败,execute()并且在命名ResultSet对象“ ResultSet”
时失败。过去它从来没有抱怨过createStatement()。但是由于某种原因,对于存储过程,它不喜欢这种命名约定。

谢谢。


阅读 525

收藏
2020-06-08

共1个答案

一尘不染

我们的服务器像这样从Java调用存储的proc-在SQL Server 2000和2008上均可使用:

String SPsql = "EXEC <sp_name> ?,?";   // for stored proc taking 2 parameters
Connection con = SmartPoolFactory.getConnection();   // java.sql.Connection
PreparedStatement ps = con.prepareStatement(SPsql);
ps.setEscapeProcessing(true);
ps.setQueryTimeout(<timeout value>);
ps.setString(1, <param1>);
ps.setString(2, <param2>);
ResultSet rs = ps.executeQuery();
2020-06-08