JDBC 调用中的参数无效:参数索引超出范围(使用 Ucanaccess)
Invalid argument in JDBC call: parameter index out of range (Using Ucanaccess)
我正在创建一个包含来自 java 的升级系统的游戏。到目前为止,我一直在使用Ucanaccess读取用户当前的等级和经验(0-100)。
我正在编写一个使用 if 语句的代码,声明当用户的经验条为 100 或超过 100 时,它会 select 用户当前的级别,他们将升级一级,以及扣除超过100的额外经验值并转移到新的级别。 (如果 exp = 129,新的 exp = 129-100)。
这是我的带有 if 语句的代码:
if (exp >= 100)
{
try
{
Connection conn = DriverManager.getConnection("jdbc:ucanaccess://C:\Users\evanc\Documents\NetBeansProjects\IT PAT task\IT PAT DataBase\userDB.accdb");
String query = "SELECT * FROM [tblUser] WHERE username = " + "'" + User.getInstance().username + "'";
PreparedStatement pst = conn.prepareStatement(query);
ResultSet rs = pst.executeQuery();
rs.next();
String newLevel = Integer.toString(User.getInstance().level + 1) ;
String updateQuery = "UPDATE tblUser SET (level) = (?) WHERE username=" + "'" + rs.getString("username") + "'";
PreparedStatement st = conn.prepareStatement(updateQuery);
st.setString(5,newLevel);
st.executeUpdate();
lblLevel.setText("lvl: " + Integer.toString(User.getInstance().level));
int newExp = exp - 100;
exp = newExp;
exp = User.getInstance().experience;
expBar.setValue(User.getInstance().experience);
}
catch(Exception e)
{
System.err.println("Exception occured: ");
System.err.println(e.getMessage());
}
JOptionPane.showMessageDialog(null, "Congratulations! You leveled up!");
}
这是它显示的错误:
“发生异常:
UCAExc:::4.0.4 JDBC 调用中的参数无效:参数索引超出范围:5"
我正在尝试更新我的数据库的第 5 列,称为 "level"。
如有任何帮助,我将不胜感激!
首先:您的代码中有一个额外的 }
,我编辑了您的问题并将其删除。
二、真题
您的查询是:
String updateQuery = "UPDATE tblUser SET (level) = (?) WHERE username=" + "'" + rs.getString("username") + "'";
然后你准备它:
PreparedStatement st = conn.prepareStatement(updateQuery);
所以一旦准备好,对象 st
就有 1 个参数可用。将替换查询中的 ?
标记的值。 st
不知道 ?
的替换实际上是数据库中的第 5 个元素。从它的角度来看,它只等待 1 个参数。
当你想为查询中的?
设置一个值时,它因此是第一个字段。所以你的代码应该是:
st.setString(1,newLevel);
查看此页面:https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html
它向您展示了一个包含多个 ?
的准备语句示例。您将在查询中看到两个 ?
。所以他们必须设置1
和2
的值。
还有一点,我不明白你为什么要把(level + 1)转成字符串。您可以使用 st.setInt(1, newLevel)
并保留所有数字。您的来电。只要确保数据库中字段的数据类型也是整数即可。
我正在创建一个包含来自 java 的升级系统的游戏。到目前为止,我一直在使用Ucanaccess读取用户当前的等级和经验(0-100)。
我正在编写一个使用 if 语句的代码,声明当用户的经验条为 100 或超过 100 时,它会 select 用户当前的级别,他们将升级一级,以及扣除超过100的额外经验值并转移到新的级别。 (如果 exp = 129,新的 exp = 129-100)。
这是我的带有 if 语句的代码:
if (exp >= 100)
{
try
{
Connection conn = DriverManager.getConnection("jdbc:ucanaccess://C:\Users\evanc\Documents\NetBeansProjects\IT PAT task\IT PAT DataBase\userDB.accdb");
String query = "SELECT * FROM [tblUser] WHERE username = " + "'" + User.getInstance().username + "'";
PreparedStatement pst = conn.prepareStatement(query);
ResultSet rs = pst.executeQuery();
rs.next();
String newLevel = Integer.toString(User.getInstance().level + 1) ;
String updateQuery = "UPDATE tblUser SET (level) = (?) WHERE username=" + "'" + rs.getString("username") + "'";
PreparedStatement st = conn.prepareStatement(updateQuery);
st.setString(5,newLevel);
st.executeUpdate();
lblLevel.setText("lvl: " + Integer.toString(User.getInstance().level));
int newExp = exp - 100;
exp = newExp;
exp = User.getInstance().experience;
expBar.setValue(User.getInstance().experience);
}
catch(Exception e)
{
System.err.println("Exception occured: ");
System.err.println(e.getMessage());
}
JOptionPane.showMessageDialog(null, "Congratulations! You leveled up!");
}
这是它显示的错误: “发生异常: UCAExc:::4.0.4 JDBC 调用中的参数无效:参数索引超出范围:5"
我正在尝试更新我的数据库的第 5 列,称为 "level"。
如有任何帮助,我将不胜感激!
首先:您的代码中有一个额外的 }
,我编辑了您的问题并将其删除。
二、真题
您的查询是:
String updateQuery = "UPDATE tblUser SET (level) = (?) WHERE username=" + "'" + rs.getString("username") + "'";
然后你准备它:
PreparedStatement st = conn.prepareStatement(updateQuery);
所以一旦准备好,对象 st
就有 1 个参数可用。将替换查询中的 ?
标记的值。 st
不知道 ?
的替换实际上是数据库中的第 5 个元素。从它的角度来看,它只等待 1 个参数。
当你想为查询中的?
设置一个值时,它因此是第一个字段。所以你的代码应该是:
st.setString(1,newLevel);
查看此页面:https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html
它向您展示了一个包含多个 ?
的准备语句示例。您将在查询中看到两个 ?
。所以他们必须设置1
和2
的值。
还有一点,我不明白你为什么要把(level + 1)转成字符串。您可以使用 st.setInt(1, newLevel)
并保留所有数字。您的来电。只要确保数据库中字段的数据类型也是整数即可。