1

我正在尝试从我的存储过程中获取结果,我得到了ERROR: Incorrect syntax near '{'.. 我看到很多例子对 a 使用相同的东西,sql string但我不知道为什么会出现错误..我有相同数量的参数...

当我像这样执行我的数据库的存储过程时

exec rptGetAssetbyLocation '2122' 我得到了我的 5 列

如何使用 Callable Statement 返回结果?我做错了registerOutParameter什么?

try
        {
         Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                                String url = "jdbc:sqlserver:...";
                                String username = "username";
                                String password = "password";

                    sb.append("<table id=\"examplee\" border=1 >" 
                    + "<tr><td>ID</td><td>TAG</td><td>NAME</td>"
                        + "<td>MODEL</td><td>SERIAL NUMBER</td></tr>");

            String query = "{exec rptGetAssetbyLocation(?,?,?,?,?)}";
      Connection conn = DriverManager.getConnection(url, username, password);
                    CallableStatement stmt = conn.prepareCall(query);
                    stmt.registerOutParameter(1, java.sql.Types.INTEGER);
                    stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
                    stmt.registerOutParameter(3, java.sql.Types.VARCHAR);
                    stmt.registerOutParameter(4, java.sql.Types.VARCHAR);
                    stmt.registerOutParameter(5, java.sql.Types.VARCHAR);


                                ResultSet rs = stmt.executeQuery();


            while (rs.next())
            {
                int id = rs.getInt("ID");
                String tag = rs.getString("tag");
                String name = rs.getString("name"); 
                String model = rs.getString("model"); 
                String serNum = rs.getString("serialNumber");

                sb.append("<tr><td>" + id + "</td>" 
                        + "<td>" + tag + "</td>" 
                        + "<td>" + name + "</td>" +
                        "<td>" + model + "</td>" +
                        "<td>" + serNum + "</td></tr>");
            }
            sb.append("</table>");
        }
        catch(Exception e)
        {
            sb.append("<h1>ERROR: " + e.getMessage() + "</h1>");
        }
        sb.append("</body></html>");
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println(sb);
    }
4

2 回答 2

4

如果您在 SQL Server Management Studio (SSMS) 中运行存储过程所做的一切都是

exec rptGetAssetbyLocation '2122' 

那么你可能不需要弄乱输出参数,你可以只使用一个输入参数来调用你的存储过程,然后像这样从 ResultSet 中检索结果

String query = "exec rptGetAssetbyLocation ?";
Connection conn = DriverManager.getConnection(url, username, password);
CallableStatement stmt = conn.prepareCall(query);
stmt.setString(1, "2122");
ResultSet rs = stmt.executeQuery();
while (rs.next())
{
    int id = rs.getInt("ID");
    String tag = rs.getString("tag");
    String name = rs.getString("name"); 
    String model = rs.getString("model"); 
    String serNum = rs.getString("serialNumber");
    // ...and do other useful stuff
}
于 2014-04-13T20:25:21.537 回答
2

除了Gord Thompson 的回答之外,您还可以对存储过程使用 JDBC 调用转义。

JDBC 转义是 JDBC 标准中定义的非常具体的转义,用于弥合 SQL 实现之间的差异。JDBC 转义被转换为数据库服务器特定的语法。

对于调用存储过程,转义是:

{call procname(arg1, ..,)}

或者对于具有返回值的存储过程:

{? = procname(arg1, ...)}

其中arg1etc 是文字值或参数占位符。请参阅CallableStatementapidoc。当准备或执行时,驱动程序会将其转换为数据库语法(即EXEC procname arg1, ...在 SQL 服务器的情况下)。

您在问题中尝试使用的语法是 JDBC 转义({...})和执行存储过程的 SQL Server 特定语法之间的混合。

此外,您的存储过程的结果可能不是 out 参数,而是 a ResultSet,但这取决于存储过程的定义。

于 2014-04-13T21:29:14.910 回答