Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的update语句_Java_Sql_Prepared Statement - Fatal编程技术网

Java中的update语句

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语句中的所有内容,并在catch语句中显示错误消息。我不确定我遗漏了什么,因为它没有显示任何语法错误

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();
  • 能否尝试在catch块中添加e.printStackTrace()
  • 在查询中,在何处之前删除 更新项目集名称=?,大小=?,价格=?其中项目代码=
  • 您的数据库可能有问题……您的项表是否在默认模式中?……printStackTrace()将帮助您找到答案

  • 在获得数据库连接后,请将“自动提交”设置为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没问题;而且。。。欢迎来到堆栈溢出!当你提问时,别忘了让社区知道答案是否有助于你投票或接受答案!谢谢~现在问题已经解决了,问题是设置字符串调用的顺序