我很难从Java / jsp执行MS SQLServer存储过程。我希望返回一个表数据集;存储过程的最后一行是来自表的常规select语句。
(从这一点来看,执行存储过程很困难PHP。)
PHP
我没有意识到有一个功能仅用于存储过程,就像我正在使用的createStatement()那样。
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对用户有用。另一个问题是从存储过程返回表数据。
GRANT EXECUTE
如果我有这样的程序:
CREATE PROCEDURE sp_test2 AS BEGIN SELECT * FROM TABLE END
如何在jsp中操作表格数据?这ResultSet是可行的还是仅适用于临时查询(与存储过程相反),而不是createStatement()用于执行查询的存储过程?
ResultSet
更新2:
解:
为了操作表数据,我必须使用以下命令:
java.sql.ResultSet RS = cs.executeQuery();
它失败,execute()并且在命名ResultSet对象“ ResultSet” 时失败。过去它从来没有抱怨过createStatement()。但是由于某种原因,对于存储过程,它不喜欢这种命名约定。
execute()
我们的服务器像这样从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();