8

我是 SQL 的新手。我正在尝试自学如何使用 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)
4

5 回答 5

13

最后一门课程列具有 varchar2 数据类型,因此您必须将值保留在单引号 (' ') 中

       String sql = "INSERT INTO MYLOVELYSTUDENTS " 
         + "VALUES (123456789, 'Zara', 'Ali', 18, 'database')";
                            quotes needed here ---^--------^
于 2013-08-19T07:04:14.513 回答
9

您忘记引用“数据库”:

String sql = "INSERT INTO MYLOVELYSTUDENTS " 
             + "VALUES (123456789, 'Zara', 'Ali', 18, 'database')";
                                quotes needed here ---^--------^
于 2013-08-19T07:00:35.513 回答
7

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

我只看到了一个:我认为您需要在“数据库”一词周围加上引号。

于 2013-08-19T07:05:32.037 回答
3

最后一列是一VARCHAR列,但您似乎将未引用的值传递给insert语句

代替...

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

尝试使用

String sql = "INSERT INTO MYLOVELYSTUDENTS " + 
             "VALUES (123456789, 'Zara', 'Ali', 18, 'database')";
于 2013-08-19T07:01:30.520 回答
2

问题出在这一行,因为错误显示:

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

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

于 2013-08-19T07:04:00.587 回答