-1

データベースで Java サーブレットを使用していますが、「インデックス 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>

サーブレット.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
4

1 に答える 1

4

CallableStatementによって返されるセッター メソッドを使用して、Connection#prepareCall(String)渡したオブジェクトを、 で見つかったそれぞれのインデックスに割り当て?ます。は 1 つしかないため、その 1 つしか設定できません。2 番目のセッター呼び出し:String1?

stat.setString(2, message);

したがって、失敗し、表示される例外をスローします。

パラメータが 2 つあるためPROCEDURE、次のように呼び出す必要があります。

stat = con.prepareCall("{CALL procAdd(?, ?)}");
stat.setString(1, name);
stat.setString(2, message); 
于 2013-04-10T17:41:07.393 に答える