如何在java / jsp中执行MS SQL Server存储过程,返回表数据?
我很难从Java / jsp执行MS SQLServer存储过程。我希望返回一个表数据集;存储过程的最后一行是来自表的常规select语句。
(从这一点来看,执行存储过程很困难PHP
。)
我没有意识到有一个功能仅用于存储过程,就像我正在使用的createStatement()
那样。
现在,请了解该存储过程在SQL Server Management Studio中可以完美执行,并且使用jsp /
java执行临时查询没有问题createStatement()
。
我创建了一个不带参数的简单存储过程,只是为了缩小问题范围:
CREATE PROCEDURE sp_test ASBEGIN
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.jspType 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 exceptionjava.sql.SQLException: The EXECUTE permission was denied on the object 'sp_test', database 'test', schema 'dbo'.
因此,我已经知道我必须要GRANT EXECUTE
对用户有用。另一个问题是从存储过程返回表数据。
如果我有这样的程序:
CREATE PROCEDURE sp_test2 ASBEGIN
SELECT * FROM TABLE
END
如何在jsp中操作表格数据?这ResultSet
是可行的还是仅适用于临时查询(与存储过程相反),而不是createStatement()
用于执行查询的存储过程?
谢谢。
解:
为了操作表数据,我必须使用以下命令:
java.sql.ResultSet RS = cs.executeQuery();
它失败,execute()
并且在命名ResultSet
对象“ ResultSet”
时失败。过去它从来没有抱怨过createStatement()
。但是由于某种原因,对于存储过程,它不喜欢这种命名约定。
谢谢。
回答:
我们的服务器像这样从Java调用存储的proc-在SQL Server 2000和2008上均可使用:
String SPsql = "EXEC <sp_name> ?,?"; // for stored proc taking 2 parametersConnection 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();
以上是 如何在java / jsp中执行MS SQL Server存储过程,返回表数据? 的全部内容, 来源链接: utcz.com/qa/411258.html