0

IDフィールドがinteger primary key(したがってautoincremented )のSQLiteデータベースにテーブルがあります。テーブルにレコードを挿入する次のクエリがあります。

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

最初のフィールドu_idは省略されています。このクエリは端末から正常に実行され、レコードを挿入できますが、Java から挿入するSQLExceptionと messageがスローされますusers.u_id may not be NULL。私はPreparedStatement次のクエリで使用しています:

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

ここで何が間違っていますか?

注: 私は、JDBC ドライバーSQLiteJDBCを使用して SQLite 3 を使用しています(サイトは閉鎖されていますが、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フィールドがテーブル フィールドにマップされたエンティティ クラスのオブジェクトです。また、私のコントローラー(RegisterUserサーブレット)はDatabaseManagerクラスを使用してレコードを挿入しており、DatabaseManagerクラスにはinsertUser()クラスのエンティティクラスのオブジェクトの引数を受け入れるメソッドがあることに注意してくださいUser

以下は、テーブルを作成するための SQLusersです。

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

2 に答える 2

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());

thisによると、 null として設定するとうまくいくはずです。

挿入時に ROWID が指定されていない場合、または指定された ROWID の値が NULL の場合、適切な ROWID が自動的に作成されます。

上記のステートメントの最初の部分によると正しいのに、なぜあなたのコードが機能しなかったのかわかりません。

編集:

これに遭遇しまし。コードで正しいデータベースを指しているかどうかを確認してください。

于 2012-08-04T14:03:15.490 に答える