我在IntelliJ上执行我的代码,它显示了这个代码中的错误,我不明白为什么?我在我的数据库中只有3列和1行,我想用新值更新每列(VARCHAR()),但一直显示此错误。
print("n>>");//print is a function which does System.out.print("");
String url= in.escinput();//escinput() is a function which does ob.nextLine()
print(">>");
String user=in.escinput();
print(">>");
String pass=in.escinput();
String nurl="",nuser="",npass="";
println("Uploading updates...");
try {
Connection c = DriverManager.getConnection(url, user, password);
Statement s=c.createStatement();
PreparedStatement ps;
ps=c.prepareStatement("Update conn set url="+url);
ps=c.prepareStatement("Update conn set user="+user);
ps=c.prepareStatement("Update conn set password="+pass);
ps.executeUpdate();
ResultSet rs=s.executeQuery("SELECT * from conn");
while (rs.next())
{
nurl=(rs.getString("url"));
nuser=(rs.getString("user"));
npass=(rs.getString("password"));
}
if ((nurl.equals(url))||(nuser.equals(user))||(npass.equals(pass)))
{
if ((nurl.equals(url))&&(nuser.equals(user))&&(npass.equals(pass)))
println("Update was sucessful");
else
{
if (!(nurl.equals(url)))
println("URL was not updated");
if (!(nuser.equals(user)))
println("USER was not updated");
if (!(npass.equals(pass)))
println("PASSWORD was not updated");
}
}
c.close();
}
catch (Exception e)
{
in.conerror();
String h=in.escinput();
if (h.equals("printST"))
e.printStackTrace();
}
在这一行
PreparedStatement ps;
ps=c.prepareStatement("Update conn set url="+url);
ps=c.prepareStatement("Update conn set user="+user);
ps=c.prepareStatement("Update conn set password="+pass);
ps.executeUpdate();
IntelliJ显示这个错误
java.sql.SQLSyntaxErrorException: Unknown column 'passs' in 'field list'
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1350)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025)
at JA_2_0.main(JA_2_0.java:256)
我不明白发生了什么,请帮帮我
因为我在你的代码中没有看到passs
(有三个s
字符),我猜pass
变量包含像,passs
这样的东西,很可能是为了测试你正确使用PreparedStatement的故意措施。
不要发明自己的输入过滤
我假设in.escinput()
是为了消毒字符串,以便将其安全地放入SQL语句中。但是,程序员不应该自己这样做。PreparedStatement已经做到了这一点,而且它总是比任何应用程序程序员做得更好:
String pass = ob.nextLine();
// ...
ps = c.prepareStatement("Update conn set password=?");
ps.setString(1, pass);
重复赋值是破坏性的,而不是加性的
赋值操作符(=
)不对变量加值。当您将三个值赋给ps
时,您只是替换了ps
的值。旧值将被丢弃。没有什么秘密机制可以记住或添加批处理操作中的赋值。
你可能只需要一个更新语句:
String url = ob.nextLine();
String user = ob.nextLine();
String pass = ob.nextLine();
// ...
ps = c.prepareStatement("Update conn set url=?, user=?, password=?");
ps.setString(1, url);
ps.setString(2, user);
ps.setString(3, pass);
ps.executeUpdate();
ps.close();
你也可以把它写成三条语句,尽管这样做没有任何好处,而且实际上会更慢:
ps = c.prepareStatement("Update conn set url=?");
ps.setString(1, url);
ps.executeUpdate();
ps.close();
ps = c.prepareStatement("Update conn set user=?");
ps.setString(1, user);
ps.executeUpdate();
ps.close();
ps = c.prepareStatement("Update conn set password=?");
ps.setString(1, pass);
ps.executeUpdate();
ps.close();
方法调用不需要用圆括号括起来
最后,你不需要把每个表达式都括起来。通常,只有在需要覆盖操作符的自然优先级时才需要括号。虽然它们对程序的行为没有什么影响,但它们确实使你的代码更难阅读和维护。
意思是,你可以修改这个:
nurl=(rs.getString("url"));
nuser=(rs.getString("user"));
npass=(rs.getString("password"));
:
nurl=rs.getString("url");
nuser=rs.getString("user");
npass=rs.getString("password");
你可以修改这个:
if ((nurl.equals(url))||(nuser.equals(user))||(npass.equals(pass)))
{
if ((nurl.equals(url))&&(nuser.equals(user))&&(npass.equals(pass)))
:
if (nurl.equals(url) || nuser.equals(user) || npass.equals(pass))
{
if (nurl.equals(url) && nuser.equals(user) && npass.equals(pass))
你可以修改这个:
if (!(nurl.equals(url)))
println("URL was not updated");
if (!(nuser.equals(user)))
println("USER was not updated");
if (!(npass.equals(pass)))
println("PASSWORD was not updated");
:
if (!nurl.equals(url))
println("URL was not updated");
if (!nuser.equals(user))
println("USER was not updated");
if (!npass.equals(pass))
println("PASSWORD was not updated");
句点(.
)具有极高的优先级,因此使用句点的表达式几乎在任何情况下都被视为单个值。