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 - 索引超出范围[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
说说StatementPreparedStatement和CallableStatement的异同(转)
SQL CallableStatement - 索引超出范围[关闭]
Statement, PreparedStatement和CallableStatement的区别