1

我需要在表格中插入一些数据。当程序执行插入时,可能会出现错误,因为我还没有创建表。我想在 catch 块中创建该表并返回到 try 块。因此,每当表被删除或碰巧删除时,try catch 都会构建表。

我已经为它编写了一些代码,但它失败了。

import java.sql.*;

/**
 *
 * @author JOJO
 */
public class ConnectDB {
  static Connection conn;
   static String driver = "org.apache.derby.jdbc.ClientDriver";
   static String connectionURL = "jdbc:derby://localhost:1527/Libraryprj;user=scott;password=tiger";

  public void AddBookDB(String bookName) throws SQLException {

    String createString = "CREATE TABLE BOOKLEDGER (BOOKNAME VARCHAR(50) NOT NULL)";
    try {
      Class.forName(driver);
    } catch (java.lang.ClassNotFoundException e) {
      e.printStackTrace();
    }
    try
        {
            conn = DriverManager.getConnection(connectionURL);
            Statement stmt = conn.createStatement();
            boolean execute = stmt.execute("insert into BOOKLEDGER values ('" + bookName + "')");
            stmt.close();
        }
        catch (SQLException sqlExcept)
        {
            Statement stmt = (Statement) conn.createStatement();
            stmt.executeUpdate(createString);

            sqlExcept.printStackTrace();
        }
  }
}
4

3 回答 3

3

从我的角度来看,最好以另一种方式进行(使用控制结构而不是 try-catch),因此您可以先测试表是否以这种方式存在:

DatabaseMetaData md = conn.getMetaData();
ResultSet rs = md.getTables(null, null, "table_name", null);
if (!rs.next()) {
  //Table not Exist, let's create it 
}
//Insert data into the table ...

在类似的情况下使用 try-catch 是一种不好的做法,try-catch 构造应该只用于捕获异常情况,而不是代替控制结构......

于 2012-07-28T08:43:37.143 回答
1

这是一个额外的查询,但我总是使用这个解决方案:

Connection connection = DriverManager.getConnection(...) // create the connection
Statement statement = connection.createStatement(...)

并使用此查询,以确保该表存在。它只会失败,如果有人在您的以下 java 代码运行时删除了您的表...

statement.execute("CREATE TABLE IF NOT EXISTS yourtable(...Your schema...)");

在这一点之后,您可以假设该表存在并使用它,而不会出现任何严重问题

于 2012-07-28T08:57:55.467 回答
1

您的方法的主要问题是您正在捕获 generic SQLException,这可能是由于各种各样的原因而发生的,您假设的原因只是其中之一。这就是为什么在尝试创建表之前明确测试表不存在的条件更为合适的原因。

于 2012-07-28T09:21:38.960 回答