2012-03-09 97 views
1

我有以下代码来更新记录。代码编译但是它会跳过try语句中的所有内容,并在catch语句中显示错误消息。我不确定我错过了什么,因为它没有显示任何类型的语法错误。Java中的更新声明

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");  
} 

回答

9

你在吞咽异常,这通常是一个坏主意。至少请拨打e.printStackTrace(),以便您输出例外情况。

碰巧,您的SQL语句中有语法错误:UPDATE item SET Name = ?, Size = ?, Price = ?, WHERE ItemCode = ? - 从Price = ?之后删除逗号。


为了解决为什么UPDATE语句仍不能正常工作的混乱,尽管固定的语法错误,请允许我更详细地(更容易做到这一点的答案,而不是评论)说明。

在您的SQL字符串中的字符?是,你会与各set_()方法之一设定值的占位符(在你的情况下,只有永远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 
+0

它的这样一个愚蠢的错误我已经感谢你使我认识到:)但现在它显示消息框“更新”,但变化并不需要在数据库中的影响......你知道为什么这可能是? – FatmaTurk 2012-03-09 18:28:19

+1

@FatmaTurk您的SQL字符串中有四个占位符,编号为1到4. 1是'Name'的值,2是'Size'的值,3是'Price'的值,4是' ItemCode'。现在看看你在'st.setString()'调用中传递的值。 – 2012-03-09 18:31:25

+0

您可以像这样更新实际行的计数int updating = st.executeUpdate();检查计数并查看是否有实际更新。如果它返回> 0,那么检查你正在使用哪个数据库,自动提交模式是否打开等。 – 2012-03-09 18:32:18

2

您是否尝试过改变这种UPDATE语句是这样的:

"UPDATE item SET Name = ?, Size = ?, Price = ? WHERE ItemCode = ?" 

我的Price = ?后拿出最终,(逗号),因为它可以用SQL的其他冲突。

编辑:

此外,您可能要重新排列的textArea_Code.getText()行是准备好的声明的最后一个值。 否则,在ItemCode值不能与?占位符的顺序匹配起来(如此刻,它看起来像textArea_price.getText()已经习惯为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(); 


这样一来,所有的?占位符正确MATC的具有值h最多被设定:

名称:st.setString(1,textArea_ 名称 .getText());
尺寸:st。setString(2,textArea_ size .getText());
价格:st.setString(3,textArea_ price .getText());
商品代码:st.setString(4,textArea_ 代码 .getText());


这是因为参数必须以相同的顺序为占位符(见this documentation以获取更多信息。)

+0

我已经改变了我的SQL语句,但它仍然不更新数据库.. – FatmaTurk 2012-03-09 18:31:44

+0

@FatmaTurk我更新了这个答案;您可能需要重新排列占位符字符串的顺序。请参阅答案了解更多详情。 – summea 2012-03-09 18:54:44

+0

它现在的作品:)现在我可以看到订单如何也可以有所作为..非常感谢你.. – FatmaTurk 2012-03-09 19:08:11

0

什么是executeUpdate的输出?它是否返回更新的任何行数?如果不是,那么显然你的更新条款需要被更新!

如果executeUpdate确实返回一个正数,表示它更新了行数,可能是您的提交策略未设置为自动提交。在这种情况下,你可能想在executeUpdate之后提交。

con.commit(); 
+0

它现在排序的问题是setString调用的顺序 – FatmaTurk 2012-03-09 19:10:43

0
  1. 你能尝试添加e.printStackTrace()在catch块?
  2. 在您的查询中删除,之前WHERE 更新项目SET Name =?,Size =?,Price =? WHERE ItemCode =?
  3. 也许有你的数据库的一个问题...是在默认模式的项目表?...的的printStackTrace()将有助于找到答案
0

获得数据库连接设置自动提交到后为true,这样DB将被更新而没有任何错误。

connection = DBConnection.getInstance().getConnection(); 
connection.setAutoCommit(true);