1

我正在尝试将用户名添加到 .accdb 本地数据库中。我的代码如下:

try
    {
        String sql = "INSERT INTO Users VALUES('?');";
        System.out.println("SQL : " + sql);

        System.out.println("USER : " + user);

        PreparedStatement stmt = database.prepareStatement(sql);
        System.out.println("Statement : " + stmt);
        stmt.setString(1, user); 
        System.out.println("Statement : " + stmt);

        ResultSet results = stmt.executeQuery(); 
        System.out.println("Results : " + results);
    }
    catch(SQLException sqlEx)
    {
        System.out.println("* Cannot execute insertion! *");
        sqlEx.printStackTrace();
        System.exit(1);
    }

控制台输出是:

SQL : INSERT INTO Users VALUES('?');
USER : TEST
Statement : sun.jdbc.odbc.JdbcOdbcPreparedStatement@1bf73fa
Exception in thread "Thread-0" java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.clearParameter    (JdbcOdbcPreparedStatement.java:1023)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setChar    (JdbcOdbcPreparedStatement.java:3057)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setString    (JdbcOdbcPreparedStatement.java:766)
at MultiEchoServer.addRegisteredUser(MultiEchoServer.java:100)
at ClientHandler.run(MultiEchoServer.java:339)

谢谢你的帮助!

4

2 回答 2

11

这就是问题所在,我怀疑:

String sql = "INSERT INTO Users VALUES('?');";

该语句没有任何参数——它总是会插入一个问号,因为你已经把它放在引号中,所以它是一个而不是一个参数。我想你想要:

String sql = "INSERT INTO Users VALUES(?)";

(请注意,我也删除了 SQL 语句末尾的额外分号 - 我不相信你真的想要那个。)

不幸的是,这个例外并没有多大帮助,诚然......我希望有一些东西表明索引 1 超出了范围。

于 2012-04-17T21:21:18.360 回答
6

删除引号和分号:

String sql = "INSERT INTO Users VALUES(?)";
于 2012-04-17T21:21:47.143 回答