Java SQL CALLABLE语句-索引超出范围

Java SQL CALLABLE语句-索引超出范围,java,database,jsp,servlets,jdbc,Java,Database,Jsp,Servlets,Jdbc,我在数据库中使用JavaServlets,我总是会遇到“索引2超出范围”的错误。我只想从表单发送参数名和消息,并通过过程保存到数据库中。为什么我会收到这个错误消息 Add.jsp <p>${result}</p> <form action="Servlet" method="post"> <div class="comment-form"> <input type="hidden" name="

我在数据库中使用JavaServlets,我总是会遇到“索引2超出范围”的错误。我只想从表单发送参数名和消息,并通过过程保存到数据库中。为什么我会收到这个错误消息

Add.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>
程序添加

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

使用由
连接#prepareCall(String)
返回的
CallableStatement
上的setter方法,将传递的对象分配给
字符串中找到的每个
的索引,从
1
开始。由于您只有一个
,因此只能设置一个。您的第二个setter调用:

stat.setString(2, message);
因此将失败并抛出您看到的异常

因为
过程有两个参数,所以应该这样调用它

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