gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:59:39 25 4
gpt4 key购买 nike

我在从 Java/jsp 执行 MS SQL Server 存储过程时遇到困难。我希望返回一组数据;存储过程的最后一行是来自表的常规选择语句。

(从这一点来看,在 PHP 中执行存储过程是小菜一碟。)

我查看了这些网站以寻求帮助:
www.2netave.com
www.stackoverflow.com

我没有意识到有一个函数专门用于存储过程,因为我使用的是createStatement()

现在,请了解存储过程在 SQL Server Management Studio 中完美执行,并且我使用 createStatement() 在 jsp/java 中执行临时查询没有任何问题。

我创建了一个不带参数的简单存储过程,只是为了缩小问题范围:

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() 提示过这一点。但由于某种原因,对于存储过程,它不喜欢这种命名约定。

谢谢。

最佳答案

我们的服务器像这样从 Java 调用存储过程 - 适用于 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();

关于sql - 如何在 java/jsp 中执行 MS SQL Server 存储过程并返回表数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6113674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com