SQL CallableStatement - 索引超出范围[关闭]

Posted

技术标签:

【中文标题】SQL CallableStatement - 索引超出范围[关闭]【英文标题】:SQL CallablStatement - The index is out of range [closed] 【发布时间】:2013-04-10 17:33:39 【问题描述】:

我将 java servlet 与数据库一起使用,但总是出现“索引 2 超出范围”的错误。我只想从表单发送参数名称和消息,并通过过程保存到数据库中。为什么我会收到此错误消息?

添加.jsp

<p>$result</p>
    <form action="Servlet" method="post">
        <div class="comment-form">
            <input type="hidden" name="action" value="4">
            <p class="name">
                <label>Name:</label>
                <input type="text" name="name" value="$param.name">
            </p>
            <p class="text">
                <label>Message:</label>
                <textarea name="message"></textarea>
            </p>
            <p class="submit">
                <input type="submit" name="btnComment" value="Add">
            </p>
        </div>
    </form>

Servlet.java

    String name = request.getParameter("name");
    String message = request.getParameter("message");
    if (name == null || name.trim().equals("")) 
        request.setAttribute("result", "Name missing!");
        return "Add.jsp";
     else 
        try 
            con = comments.getConnection();
            synchronized (con) 
                stat = con.prepareCall("CALL procAdd(?)");
                stat.setString(1, name);
                stat.setString(2, message);
                stat.executeUpdate();
            
            request.setAttribute("result", "Comment added.");
            return "Comments.jsp";
         catch (Exception e) 
            request.setAttribute("result", "Error: " + e.getMessage());
            return "Add.jsp";
        

程序procAdd

CREATE PROCEDURE procAdd (
@Name VARCHAR (50),
@Message VARCHAR(50))
AS
BEGIN
INSERT INTO Comments(Name, Date, Message) VALUES (@Name, GETDATE(), @Message)
END

【问题讨论】:

【参考方案1】:

使用Connection#prepareCall(String) 返回的CallableStatement 上的setter 方法,将您传递的对象分配给在String 中找到的每个? 的索引,从1 开始。由于您只有一个?,因此您只能设置那个。您的第二个二传手电话:

stat.setString(2, message);

因此会失败并抛出您看到的异常。

因为你的PROCEDURE 有两个参数,你应该这样称呼它

stat = con.prepareCall("CALL procAdd(?, ?)");
stat.setString(1, name);
stat.setString(2, message); 

【讨论】:

以上是关于SQL CallableStatement - 索引超出范围[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用CallableStatement接口调用存储过程

说说StatementPreparedStatement和CallableStatement的异同(转)

SQL CallableStatement - 索引超出范围[关闭]

Statement, PreparedStatement和CallableStatement的区别

JDBC Statements, PreparedStatement和CallableStatement语句

CallableStatement + registerOutParameter + 多行结果