2013-08-19 178 views
2

我是SQL中的新手。我试图教自己如何使用H2。我设法创建了一个表,但是当我尝试使用另一个类插入数据时,数据不会被插入。将数据插入H2数据库表

这里是我的代码:

,创造了 “MYLOVELYSTUDENTS” 表类:

// STEP 1. Import required packages 
import java.sql.*; 

public class JDBCExampleNewTable { 
    // JDBC driver name and database URL 
    static final String JDBC_DRIVER = "org.h2.Driver"; //org.h2.Driver 
    static final String DB_URL = "jdbc:h2:~/mytest"; 

    // Database credentials 
    static final String USER = "sa"; 
    static final String PASS = ""; 

    public static void main (String[] args) { 
     Connection conn = null; 
     Statement stmt = null; 

     try { 
      //STEP 2: Register JDBC driver 
      Class.forName("org.h2.Driver"); 

      //STEP 3: Open a connection 
      System.out.println("Connecting to a selected database..."); 
      conn = DriverManager.getConnection(DB_URL, USER, PASS); 
      System.out.println("Connected database successfully..."); 

      //STEP 4: Execute a query 
      System.out.println("Creating table in given database..."); 
      stmt = conn.createStatement(); 

      String sql = "CREATE TABLE MYLOVELYSTUDENTS " + 
        "(studentid INTEGER not NULL, " + 
        " first VARCHAR(255), " + 
        " last VARCHAR(255), " + 
        " age INTEGER, " + 
        " course VARCHAR(255))"; 

      stmt.executeUpdate(sql); 
      System.out.println("Created table in given database..."); 
     } catch (SQLException se) { 
      //Handle errors for JDBC 
      se.printStackTrace(); 
     } catch (Exception e) { 
      //Handle errors for Class.forName 
      e.printStackTrace(); 
     } finally { 
      //finally block used to close resources 
      try { 
       if (stmt!=null) 
        conn.close(); 
      } catch (SQLException se) { 
      } // do nothing 
      try { 
       if (conn!= null) 
        conn.close(); 
      } catch (SQLException se) { 
       se.printStackTrace(); 
      } // end finally try 
     } // end try 
     System.out.println("Goodbye!"); 
    } // end main 
} // end JDBCExample 

是插入到 “MYLOVELYSTUDENTS” 表类:

//STEP 1. Import required packages 
import java.sql.*; 

public class JDBCExampleInsertRecordsExample { 
    // JDBC driver name and database URL 
    static final String JDBC_DRIVER = "org.h2.Driver"; 
    static final String DB_URL = "jdbc:h2:~/mytest"; 

    // Database credentials 
    static final String USER = "sa"; 
    static final String PASS = ""; 

    public static void main (String[] args) { 
     Connection conn = null; 
     Statement stmt = null; 

     try { 
      //STEP 2: Register JDBC driver 
      Class.forName(JDBC_DRIVER); 

      //STEP 3: Open a connection 
      System.out.println("Connecting to a selected database..."); 
      conn = DriverManager.getConnection(DB_URL, USER, PASS); 
      System.out.println("Connected database successfully..."); 

      //STEP 4: Execute a query 
      System.out.println("Inserting records into the table..."); 
      stmt = conn.createStatement(); 

      String sql = "INSERT INTO MYLOVELYSTUDENTS " + "VALUES (123456789, 'Zara', 'Ali', 18, database)"; 

      stmt.executeUpdate(sql); 

      System.out.println("Inserted records into the table..."); 

     } catch (SQLException se) { 
      //Handle errors for JDBC 
      se.printStackTrace(); 
     } catch (Exception e) { 
      //Handle errors for Class.forName 
      e.printStackTrace(); 
     } finally { 
      //finally block used to close resources 
      try { 
       if (stmt!=null) 
        conn.close(); 
      } catch (SQLException se) { 
      } // do nothing 
      try { 
       if (conn!=null) 
        conn.close(); 
      } catch (SQLException se) { 
       se.printStackTrace(); 
      } //end finally try 
     } //end try 

     System.out.println("Goodbye!"); 

    } //end main 
} //end JDBCExample 

错误信息:

run: 
Connecting to a selected database... 
Connected database successfully... 
Inserting records into the table... 
org.h2.jdbc.JdbcSQLException: Column "DATABASE" not found; SQL statement: 
INSERT INTO MYLOVELYSTUDENTS VALUES (123456789, 'Zara', 'Ali', 18, database) [42122-173] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:331) 
    at org.h2.message.DbException.get(DbException.java:171) 
    at org.h2.message.DbException.get(DbException.java:148) 
    at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:144) 
    at org.h2.command.dml.Insert.prepare(Insert.java:238) 
    at org.h2.command.Parser.prepareCommand(Parser.java:219) 
    at org.h2.engine.Session.prepareLocal(Session.java:428) 
    at org.h2.engine.Session.prepareCommand(Session.java:377) 
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1138) 
    at org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:124) 
    at org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:113) 
    at Database.H2Samples.JDBCExampleInsertRecordsExample.main(JDBCExampleInsertRecordsExample.java:34) 
Goodbye! 
BUILD SUCCESSFUL (total time: 4 seconds) 

回答

8

最后一道菜列具有VARCHAR2数据类型,所以你必须保持值的单引号(”“)

 String sql = "INSERT INTO MYLOVELYSTUDENTS " 
     + "VALUES (123456789, 'Zara', 'Ali', 18, 'database')"; 
          quotes needed here ---^--------^ 
+0

谢谢Mohsin Shaikh。 –

4

你忘了引用“数据库”:

String sql = "INSERT INTO MYLOVELYSTUDENTS " 
      + "VALUES (123456789, 'Zara', 'Ali', 18, 'database')"; 
           quotes needed here ---^--------^ 
1

最后一列是一个VARCHAR列,但你似乎在传递一个引号值的insert声明

而不是...

String sql = "INSERT INTO MYLOVELYSTUDENTS " + 
      "VALUES (123456789, 'Zara', 'Ali', 18, database)"; 

尝试使用

String sql = "INSERT INTO MYLOVELYSTUDENTS " + 
      "VALUES (123456789, 'Zara', 'Ali', 18, 'database')"; 
+0

谢谢MadProgrammer。 –

1

的问题是在这条线作为错误显示:

String sql = "INSERT INTO MYLOVELYSTUDENTS " + "VALUES (123456789, 'Zara', 'Ali', 18, database)"; 

也许你的意思是'database',而不是database

3

的一个好方法来调试查询是手动先进行测试。 H2有一个h2控制台(默认情况下为http://localhost:8082)。在那里你可以输入查询,并获得有关错误的反馈。

我只看到一个:我想你需要引用“数据库”这个词。

+0

我一直在使用H2多年,但从来不知道它的Web控制台。感谢你提到这一点。 – devdanke