为啥 (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] 无效?

为啥 Range 有效,但 Cells 无效?