0

我在 SQLite 数据库中有一个表,其 ID 字段为integer primary key(因此autoincremented )。我有以下查询在表中插入记录。

INSERT INTO users(fname, lname, email, password) VALUES('Foo','Bar','foo@bar.com','12345');

而第一个字段u_id被省略。这个查询在终端上运行良好,我可以插入记录,但是从 Java 中这样做会抛出SQLExceptionmessage users.u_id may not be NULL。我正在使用PreparedStatement以下查询:

INSERT INTO users(fname, lname, email, password) VALUES(?,?,?,?)

我在这里做错了什么?

注意: 我使用的是 SQLite 3,带有 JDBC 驱动程序SQLiteJDBC(该站点已关闭,但我之前确实jar下载了该文件)。跟司机有关系吗?

更新:

这是抛出异常的堆栈跟踪:

java.sql.SQLException: users.u_id may not be NULL
at org.sqlite.DB.execute(DB.java:275)
at org.sqlite.DB.executeUpdate(DB.java:281)
at org.sqlite.PrepStmt.executeUpdate(PrepStmt.java:77)
at com.paperfood.DatabaseManager.insertUser(DatabaseManager.java:64)
at com.paperfood.controller.RegisterUser.doPost(RegisterUser.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

以下是我的记录插入 Java 代码:

PreparedStatement pst = con.prepareStatement("INSERT INTO users(fname, lname, email, password) VALUES(?,?,?,?)");
pst.setString(1, user.getFirstName());
pst.setString(2, user.getLastName());
pst.setString(3, user.getEmail());
pst.setString(4, user.getPassword());
pst.executeUpdate();

其中,user是实体类的对象,其字段映射到表字段。另外,请注意我的控制器(RegisterUserservlet)正在使用DatabaseManager类来插入记录,并且DatabaseManager该类具有insertUser()接受实体类对象参数的方法 class User

以下是创建表的 SQL users

CREATE TABLE users(
    u_id integer PRIMARY KEY,
    fname varchar(30),
    lname varchar(30),
    email varchar(30),
    password varchar(32)
);
4

2 回答 2

0

你当前的主键不是自增的,所以你需要自己指定主键的值。如果您希望主键是自增的,您需要明确指定它。

请参阅:http ://www.sqlite.org/autoinc.html您的表定义需要是:

CREATE TABLE users(
    u_id integer PRIMARY KEY AUTOINCREMENT,
    fname varchar(30),
    lname varchar(30),
    email varchar(30),
    password varchar(32)
);
于 2012-08-05T09:17:35.593 回答
0

你可以试试这个。

PreparedStatement pst = con.prepareStatement("INSERT INTO users(u_id, fname, lname, email, password) VALUES(?,?,?,?,?)");

pst.setString(1, null);
pst.setString(2, user.getFirstName());
pst.setString(3, user.getLastName());
pst.setString(4, user.getEmail());
pst.setString(5, user.getPassword());

据此,将设置为 null 应该可以工作。

如果插入时没有指定 ROWID,或者指定的 ROWID 的值为 NULL,则会自动创建适当的 ROWID。

我不确定为什么您的代码不起作用,尽管根据上述语句的第一部分它是正确的。

编辑:

刚碰到这个。请检查您是否在代码中指向正确的数据库。

于 2012-08-04T14:03:15.490 回答