- PR -

Postgre7.2.1でInsertしたい

投稿者投稿内容
season
常連さん
会議室デビュー日: 2004/06/27
投稿数: 25
投稿日時: 2004-07-20 18:22
>insert into "USR" values('042007', 'aiueo' ,'aiueo')

遅くなってスミマセン。確認しました。psqlでちゃんとINSERTされてます。
042007はVARCHAR(10)です。順番も間違いないです。

プログラムの組み方が問題かソフトが問題かまだはっきりしてませんが、
もうちょっとあれこれ試してみます。
解決できたら報告しますね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-21 12:10
引用:

seasonさんの書き込み (2004-07-20 18:22) より:
>insert into "USR" values('042007', 'aiueo' ,'aiueo')

遅くなってスミマセン。確認しました。psqlでちゃんとINSERTされてます。
042007はVARCHAR(10)です。順番も間違いないです。


では次に、デバッガが使えるならステップ実行をして、使えないならすべての行の間にSystem.out.println("step count")などを挿入して、どこまで実行できているか、調べます。

#最初の投稿では、どの行でエラーになっているか、わからなかった為


また、エラーメッセージは、ソースの部分以外は省略しないで、きっちり転記する方が、早く解決する場合が多いです。


#「SQLインジェクション」って、ご存じですか?
#誰かがユーザー名に';delete "USR";//とかしたら、どうなります?
season
常連さん
会議室デビュー日: 2004/06/27
投稿数: 25
投稿日時: 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 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-21 17:33
まさかと思いますが、主キーが重複しているのではありませんか?
season
常連さん
会議室デビュー日: 2004/06/27
投稿数: 25
投稿日時: 2004-07-21 23:22
遅くなってスミマセン。

>まさかと思いますが、主キーが重複しているのではありませんか?

いえ、主キーは「USR_ID」だけにしてますので、それはないです。

「SQLインジェクション」について調べました。
ユーザが入力したもの何でもが、クエリの一部として実行されたら大変ですね。
そういう事態になるとは思ってませんでした。直しておきます。

それが直接の原因ではなさそうな気もしますが、明日職場でソースのチェックしてみます。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-22 01:31
引用:

seasonさんの書き込み (2004-07-21 23:22) より:
>まさかと思いますが、主キーが重複しているのではありませんか?

いえ、主キーは「USR_ID」だけにしてますので、それはないです。


そういう意味ではなく、既にデータベースに存在するレコードと同一のUSR_IDを持つデータを
挿入しようとしているのではないですか、ということです。システムを実行した1回目だけ
成功する、ということからの推測ですが。
タラン
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 138
投稿日時: 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/06/24
投稿数: 53
お住まい・勤務地: 横浜・川崎
投稿日時: 2004-07-22 11:11
引用:

seasonさんの書き込み (2004-07-21 17:24) より:
でも、TOMCAT起動して1回目に追加を実行するときだけ、なぜか正常に追加されます。
出力結果は

「insert into "USR" values('042005', 'aaa' ,'aaa')」

しかし、それ以降はSQLExceptionになってしまい、どうにもならなくなります。
2回目以降のエラーログを見ると、

insert into "USR" values('042006', 'bbb' ,'bbb')
予期しない時にresultが返されました。


とありますから,同じものを入れてるわけではないと思いますよ.

スキルアップ/キャリアアップ(JOB@IT)