Java中的update语句
我有以下代码来更新记录。尽管代码进行编译,但它会跳过try语句中的所有内容,并在catch语句中显示错误消息。我不确定我遗漏了什么,因为它没有显示任何语法错误Java中的update语句,java,sql,prepared-statement,Java,Sql,Prepared Statement,我有以下代码来更新记录。尽管代码进行编译,但它会跳过try语句中的所有内容,并在catch语句中显示错误消息。我不确定我遗漏了什么,因为它没有显示任何语法错误 try { PreparedStatement st = db.con.prepareStatement("UPDATE item SET Name = ?, Size = ?, Price = ?, WHERE ItemCode = ?"); st.setString(1, textArea_Cod
try {
PreparedStatement st = db.con.prepareStatement("UPDATE item SET Name = ?, Size = ?, Price = ?, WHERE ItemCode = ?");
st.setString(1, textArea_Code.getText());
st.setString(2, textArea_name.getText());
st.setString(3, textArea_size.getText());
st.setString(4, textArea_price.getText());
st.executeUpdate();
JOptionPane.showMessageDialog(frame, "Updated");
} catch (SQLException e ) {
JOptionPane.showMessageDialog(frame, "update not successful");
}
您正在接受异常,这通常是个坏主意。至少调用
e.printStackTrace()
,以便获得异常的输出
碰巧,SQL语句中有一个语法错误:updateitemsetname=?,Size=?,Price=?,其中ItemCode=?
-删除Price=?
后面的逗号
为了解决为什么UPDATE语句仍然不起作用的困惑,尽管修复了语法错误,请允许我更详细地解释一下(在答案中,而不是在注释中,这样做要容易得多) SQL字符串中的
?
字符是一个值的占位符,您将使用各种set_389;()
方法之一设置该值(在您的情况下,仅使用setString()方法)
。每个占位符都用一个从1开始的索引编号-字符串中出现的第一个?
表示索引1,第二个表示索引2,以此类推
您的SQL字符串如下所示:
UPDATE item SET Name = ?, // 1
Size = ?, // 2
Price = ? // 3
WHERE ItemCode = ? // 4
st.setString(1, textArea_Code.getText()); // ItemCode is fourth in the SQL, should be 4
st.setString(2, textArea_name.getText()); // Name is first in the SQL, should be 1
st.setString(3, textArea_size.getText()); // Size is second in the SQL, should be 2
st.setString(4, textArea_price.getText()); // Price is third in the SQL, should be 3
"UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?"
PreparedStatement st = db.con.prepareStatement("UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?");
st.setString(1, textArea_name.getText());
st.setString(2, textArea_size.getText());
st.setString(3, textArea_price.getText());
st.setString(4, textArea_Code.getText());
st.executeUpdate();
您正在为占位符设置如下值:
UPDATE item SET Name = ?, // 1
Size = ?, // 2
Price = ? // 3
WHERE ItemCode = ? // 4
st.setString(1, textArea_Code.getText()); // ItemCode is fourth in the SQL, should be 4
st.setString(2, textArea_name.getText()); // Name is first in the SQL, should be 1
st.setString(3, textArea_size.getText()); // Size is second in the SQL, should be 2
st.setString(4, textArea_price.getText()); // Price is third in the SQL, should be 3
"UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?"
PreparedStatement st = db.con.prepareStatement("UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?");
st.setString(1, textArea_name.getText());
st.setString(2, textArea_size.getText());
st.setString(3, textArea_price.getText());
st.setString(4, textArea_Code.getText());
st.executeUpdate();
您是否尝试过将UPDATE语句更改为以下内容:
UPDATE item SET Name = ?, // 1
Size = ?, // 2
Price = ? // 3
WHERE ItemCode = ? // 4
st.setString(1, textArea_Code.getText()); // ItemCode is fourth in the SQL, should be 4
st.setString(2, textArea_name.getText()); // Name is first in the SQL, should be 1
st.setString(3, textArea_size.getText()); // Size is second in the SQL, should be 2
st.setString(4, textArea_price.getText()); // Price is third in the SQL, should be 3
"UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?"
PreparedStatement st = db.con.prepareStatement("UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?");
st.setString(1, textArea_name.getText());
st.setString(2, textArea_size.getText());
st.setString(3, textArea_price.getText());
st.setString(4, textArea_Code.getText());
st.executeUpdate();
我去掉了价格=?
后面的最后一个,
(逗号),因为它可能与SQL的其余部分冲突
编辑:
另外,您可能希望重新排列textArea\u code.getText()
行,使其成为准备语句的最后一个值。否则,ItemCode值可能与?
占位符的顺序不匹配(目前看起来像textArea\u price.getText()
正被用作ItemCode
的值……这可能会对更新的内容造成危险!)
相反,像这样的事情怎么样:
UPDATE item SET Name = ?, // 1
Size = ?, // 2
Price = ? // 3
WHERE ItemCode = ? // 4
st.setString(1, textArea_Code.getText()); // ItemCode is fourth in the SQL, should be 4
st.setString(2, textArea_name.getText()); // Name is first in the SQL, should be 1
st.setString(3, textArea_size.getText()); // Size is second in the SQL, should be 2
st.setString(4, textArea_price.getText()); // Price is third in the SQL, should be 3
"UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?"
PreparedStatement st = db.con.prepareStatement("UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?");
st.setString(1, textArea_name.getText());
st.setString(2, textArea_size.getText());
st.setString(3, textArea_price.getText());
st.setString(4, textArea_Code.getText());
st.executeUpdate();
这样,所有的
?
占位符都与所设置的值正确匹配:
Name:st.setString(1,textAreaName.getText());大小:st.setString(2,textArea大小.getText());
Price:st.setString(3,text区域Price.getText());
ItemCode:st.setString(4,textAreaCode.getText());
这是因为参数的顺序必须与占位符的顺序相同(有关更多信息,请参阅)。executeUpdate的输出是什么?它是否返回任何更新的行数?如果不是,那么显然需要更新update子句 如果executeUpdate返回正数,表示它更新了行数,则可能是因为您的提交策略未设置为自动提交。在这种情况下,您可能希望在executeUpdate之后提交
con.commit();
在获得数据库连接后,请将“自动提交”设置为true,以便更新数据库时不会出现任何错误
connection = DBConnection.getInstance().getConnection();
connection.setAutoCommit(true);
这是一个愚蠢的错误,感谢你让我意识到:)但是现在它确实显示了消息框“更新”,但是更改不会在数据库中生效。。。您知道为什么会这样吗?@FatmaTurk您的SQL字符串中有四个占位符,编号为1到4。1是
Name
的值,2是Size
的值,3是Price
的值,4是ItemCode
的值。现在看看您在st.setString()
调用中传递的值代码>检查该计数,并查看是否实际更新了任何内容。如果返回>0,则检查您正在使用的数据库、自动提交模式是否启用等。executeUpdate返回一个int。您需要检查该值以确定是否有任何内容已更新。如果您看到的是零,我会检查数据库。@Patrick如果问题出在数据库上,那么我假设它也不允许我从数据库中删除记录,对吗?我已经对SQL语句进行了更改,但它仍然不会更新数据库。@FatmaTurk I更新了此答案;您可能希望尝试重新排列占位符字符串的顺序。请查看答案了解更多详细信息。它现在起作用了:)现在我可以看到订单如何也能带来不同..非常感谢..@FatmaTurk没问题;而且。。。欢迎来到堆栈溢出!当你提问时,别忘了让社区知道答案是否有助于你投票或接受答案!谢谢~现在问题已经解决了,问题是设置字符串调用的顺序