- - PR -
Postgre7.2.1でInsertしたい
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-07-20 18:22
>insert into "USR" values('042007', 'aiueo' ,'aiueo')
遅くなってスミマセン。確認しました。psqlでちゃんとINSERTされてます。 042007はVARCHAR(10)です。順番も間違いないです。 プログラムの組み方が問題かソフトが問題かまだはっきりしてませんが、 もうちょっとあれこれ試してみます。 解決できたら報告しますね。 | ||||
|
投稿日時: 2004-07-21 12:10
では次に、デバッガが使えるならステップ実行をして、使えないならすべての行の間にSystem.out.println("step count")などを挿入して、どこまで実行できているか、調べます。 #最初の投稿では、どの行でエラーになっているか、わからなかった為 また、エラーメッセージは、ソースの部分以外は省略しないで、きっちり転記する方が、早く解決する場合が多いです。 #「SQLインジェクション」って、ご存じですか? #誰かがユーザー名に';delete "USR";//とかしたら、どうなります? | ||||
|
投稿日時: 2004-07-21 17:24
何度もすみません。デバッガは使えないので、System.out.printで書きます。
ConDB cb = new ConDB(); Connection connection = cb.getConnection(); Statement stmt = connection.createStatement(); String query = "insert into \"USR\" values('" + userId + "', '" + pd.getName() + "' ,'" + pass + "')"; System.out.println(query); //←は実行されます stmt.executeUpdate(query); System.out.println(query); //←は実行されません このような状態です。 でも、TOMCAT起動して1回目に追加を実行するときだけ、なぜか正常に追加されます。 出力結果は 「insert into "USR" values('042005', 'aaa' ,'aaa')」 しかし、それ以降はSQLExceptionになってしまい、どうにもならなくなります。 2回目以降のエラーログを見ると、 insert into "USR" values('042006', 'bbb' ,'bbb') 予期しない時にresultが返されました。 at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:75) at AddUser.doGet(AddUser.java:61) at AddUser.doPost(AddUser.java:132) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:419) at org.apache.catalina.servlets.InvokerServlet.doPost(InvokerServlet.java:169) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644) at java.lang.Thread.run(Unknown Source) 失敗〜理由:予期しない時にresultが返されました。 と、SQLExceptionになり、追加されません。 エラーログを見る限り、 stmt.executeUpdate(query); ↑がおかしいようです。でも参考書を見ても、INSERTだとexecuteUpdateを使うようだし、原因の特定が困難な状態です。 >#「SQLインジェクション」って、ご存じですか? いえ、知らないです。 >#誰かがユーザー名に';delete "USR";//とかしたら、どうなります? insert into "USR" values('042006', '';delete ' ,'take') と出力されます。これは考えていませんでした(^^ [ メッセージ編集済み 編集者: season 編集日時 2004-07-21 17:36 ] | ||||
|
投稿日時: 2004-07-21 17:33
まさかと思いますが、主キーが重複しているのではありませんか?
| ||||
|
投稿日時: 2004-07-21 23:22
遅くなってスミマセン。
>まさかと思いますが、主キーが重複しているのではありませんか? いえ、主キーは「USR_ID」だけにしてますので、それはないです。 「SQLインジェクション」について調べました。 ユーザが入力したもの何でもが、クエリの一部として実行されたら大変ですね。 そういう事態になるとは思ってませんでした。直しておきます。 それが直接の原因ではなさそうな気もしますが、明日職場でソースのチェックしてみます。 | ||||
|
投稿日時: 2004-07-22 01:31
そういう意味ではなく、既にデータベースに存在するレコードと同一のUSR_IDを持つデータを 挿入しようとしているのではないですか、ということです。システムを実行した1回目だけ 成功する、ということからの推測ですが。 | ||||
|
投稿日時: 2004-07-22 09:33
一回目に成功しました?
エラーがでるって言ってませんでしたっけ? 一回目に成功すればそれはOKで 同じものをもう一度入れようとするからエラーが発生するのでは? 同じものを2回挿入しようとするとエラーがでるのが当たり前でしょ。 最初こういう話なかったので。。。 User_id (PKでしょう?) User_id(主キー)ってユニークでないとだめです。 参考になればと思います。 <追加> 状況を整理してみましょう。 User_ID: 001 と 002をインサートしたいですね Tomcatを起動させて insert into XXX values("001") インサート成功! insert into XXX values("002") この場合にExceptionですか? もしこういうケースでしたらPKの問題じゃないですね。 すると DB接続して 実行してちゃんとクローズしてますか。 でもそのExceptionではないのでこれじゃないと思いますけど 実際やってみないとなんともいえませんね。 私が誤解してたのなら申し訳ありません。 ^^ また何か情報がありましたら連絡ください。 [ メッセージ編集済み 編集者: MUSE 編集日時 2004-07-22 11:21 ] | ||||
|
投稿日時: 2004-07-22 11:11
とありますから,同じものを入れてるわけではないと思いますよ. | ||||
