为啥 (1)JDBC 代码有效而 (2) 无效?
Posted
技术标签:
【中文标题】为啥 (1)JDBC 代码有效而 (2) 无效?【英文标题】:Why the (1)JDBC code works while the (2) does not?为什么 (1)JDBC 代码有效而 (2) 无效? 【发布时间】:2011-04-23 16:49:14 【问题描述】:(1)
import java.sql.*;
public class jdbcDemo
static Connection con=null;
public static void main(String args[])
int id = 0;
try
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:login");
Statement stat = con.createStatement();
System.out.println("got connection");
ResultSet rs = stat.executeQuery("Select max(UID) from mytable");
while(rs.next())
id=rs.getInt(1);
id++;
System.out.println(id);
PreparedStatement ps = con.prepareStatement("INSERT into mytable(UID,Username,Password) values(?,?,?)");
ps.setInt(1,id);
ps.setString(2,"abhi");
ps.setString(3,"bindra");
ps.executeUpdate();
catch(Exception e)
e.printStackTrace();
(2)
import java.sql.*;
public class jdbcDemo
static Connection con=null;
public static void main(String args[])
int id = 0;
try
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:login");
Statement stat = con.createStatement();
System.out.println("got connection");
ResultSet rs = stat.executeQuery("Select max(UID) from mytable");
while(rs.next())
id=rs.getInt(1);
id++;
System.out.println(id);
PreparedStatement ps = con.prepareStatement("INSERT into mytable(UID,Username,Password) values(?,?,?)");
ps.setInt(1,id);
ps.setString(2,"abhi");
ps.setString(3,"bindra");
ps.executeUpdate();
String s1,s2;
ResultSet rs1 = stat.executeQuery("Select * from mytable where UID="+id+"");
while(rs1.next())
s1=rs1.getString(2);
s2=rs1.getString(3);
System.out.print(s1+s2);
catch(Exception e)
e.printStackTrace();
部分
ResultSet rs1 = stat.executeQuery("Select * from mytable where UID="+id+"");
while(rs1.next())
s1=rs1.getString(2);
s2=rs1.getString(3);
System.out.print(s1+s2);
为什么这个部分如此重要?为什么 ps.executeUpdate() 不将行插入表中?没有插入(1)中的部分,记录不会出现在表中。
【问题讨论】:
如果您使用 IDE,请弄清楚它如何重新格式化您的源代码。 我看不出你在第 1 部分和第 2 部分之间插入的方式有什么区别。执行后的选择查询应该没有任何区别。默认情况下,Jdbc 连接将 autoCommit 设置为 true。因此,如果您没有遇到任何异常,executeUpdate() 应该提交数据。 @Thorbjorn:我没有使用任何 IDE ..只是文本板。 @CoolBeans :确切地说,我完全认为它不应该有任何区别,但我已经完全空白了。我在准备好的语句中尝试了一个 UPDATE 查询并没有部分地执行它,直到我执行它才执行在其中插入“部分”。说真的,出了点问题 代码有很多错误,我不知道从哪里开始回答。这里至少有一个链接可以让你走上正轨:balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html 【参考方案1】:您是否曾经关闭过您的语句、结果集和连接?它们应该在 finally 子句中。
【讨论】:
【参考方案2】:在您检索到结果集之前不会发生自动提交,即使是在 INSERT、UPDATE 或 DELETE 语句上也是如此。见:http://download.oracle.com/javase/tutorial/jdbc/basics/transactions.html
默认是在 SQL 语句完成时提交,而不是在执行时提交。当检索到所有结果集和更新计数时,语句完成。
如果您对更新结果不感兴趣,请尝试在执行后立即通过con.commit()
向数据库发送提交。
【讨论】:
问题是我有其他程序带有这样的语句和 executeUpdate() 并且它们工作正常。这似乎不起作用。它可以在你的 IDE 上运行吗?以上是关于为啥 (1)JDBC 代码有效而 (2) 无效?的主要内容,如果未能解决你的问题,请参考以下文章
尽管代码相同,但切换菜单按钮在索引页面上有效,但在其他页面上无效 - 为啥?
困惑为啥在Objective C中一段代码有效而另一段代码无效
为啥 ++str 和 str+1 有效而 str++ 无效?
为啥 XPath previous-sibling::*[3] 有效,而leading-sibling::div[3] 无效?