【问题标题】: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

标签: java jdbc prepared-statement


【解决方案1】:

您是否曾经关闭过您的语句、结果集和连接?它们应该在 finally 子句中。

【讨论】:

    【解决方案2】:

    在您检索到结果集之前不会发生自动提交,即使是在 INSERT、UPDATE 或 DELETE 语句上也是如此。见:http://download.oracle.com/javase/tutorial/jdbc/basics/transactions.html

    默认是在 SQL 语句完成时提交,而不是在执行时提交。当检索到所有结果集和更新计数时,语句完成。

    如果您对更新结果不感兴趣,请尝试在执行后立即通过con.commit() 向数据库发送提交。

    【讨论】:

    • 问题是我有其他程序带有这样的语句和 executeUpdate() 并且它们工作正常。这似乎不起作用。它可以在你的 IDE 上运行吗?
    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2023-03-17
    相关资源
    最近更新 更多