- - PR -
Postgre7.2.1でInsertしたい
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-07-22 17:21
なるほど。。。
ここで質問ですが Windows、同じPostgresqlのバージョンをインストールしたのに なぜ私のほうでは””なしでも大丈夫でSEASONさんは””なしにはできないでしょうか。 こういうのが難しいですね。 それとマルチユーザってなんでしょうか。 教えていただけますか。 質問しちゃってごめんなさい。 ^^ よろしくお願いします。 | ||||
|
投稿日時: 2004-07-22 17:27
焼きそばです。
マルチユーザっていうのはちょっとおかしかったです。 混乱させて申し訳ありません。 postgresql.conf内の tcpip_socketの設定のことです。 ただ、同一マシンでやっている分にはこの設定は関係なさそうですね。 | ||||
|
投稿日時: 2004-07-23 10:58
皆さんお忙しい中ありがとうございます。遅くなってすみません。。。
Postgreのサーバ起動時でも起動時ではなくても出来るときと出来ないときがあります。出来ないときのほうがほとんどですけどね。 テーブル名に""を付けたこと・・・。今日""なしでテーブルを作成してみたら出来ました!すみません。お騒がせしました。でもPostgreをインストールしたくらいときはなぜか「ERROR near the USR」という感じのエラーがずっと出ていて、出来ないものと思っていました。そのときなぜ出来なかったのか分からないのですが、Windowsでも出来ることがわかってよかったです。本当にご迷惑をおかけして申し訳ございませんでした。m(_ _)m 教えていただいたページ、よく見ておきます。。。 でも、テーブル名に""を付けなくても、やはりなかなかINSERTされません。 テーブル作成のSQLは create table USR(USR_ID varchar(6) NOT NULL PRIMARY KEY, USR_NAME varchar(20) NOT NULL, USR_PASS varchar(10) NOT NULL ); で作成しました。 私もどのように状況を説明すればいいのか分からないのですが、 http://www10.plala.or.jp/hir_/postgre/sms.lzh に現在ユーザ登録する部分をワークスペースごとアップしてます。 都合上一部変更した部分もありますが、ディレクトリやファイルの位置はそのままです。 /tomcat 5.0/logs/stdout.log に出力されるエラー情報のファイルも一応入れてます。 もしお時間があるようでしたらこちらを見ていただけるとありがたいです。 >ConDB cb = new ConDB(); これは、データベースに接続するコネクション部分のクラスにしてます。 | ||||
|
投稿日時: 2004-07-23 13:25
ざっと見てみました。これだけ見ると、コネクションの管理など問題のあるところはいろいろ ありますが、動かない理由はないように思います。で、例外が出ているPostgresのJDBCドライバ の該当部分のソースを読んでみたのですが、その例外はSQL実行でリザルトセットが返ってきた 場合に出るようです。 そこで提案ですが、まずSearchクラスとAddUserクラスでコネクションのクローズをきっちり やるようにしてみたらどうなるでしょうか。JDBCドライバのコネクションの実装によって起きて いそうな気がしますし、クローズ処理はそもそもきっちりやるべきものですから、まずそこから 手をつけてください。 また、今回に関しては本質的な問題ではないですが、ConDBの実装もあのままではまずいと思います。 | ||||
|
投稿日時: 2004-07-23 14:57
お忙しいところ有難うございます。
コネクションのクローズの部分↓を加えてみたのですが、 stmt.close(); connection.close(); やはり動作しませんでした。 しかし、MUSEさんが動作確認してくださったような public static void mainを使うJavaで試してみたら正常にInsertされました。 Servletだけはなぜかできません。 SearchクラスにもAddUserクラスにもクローズ部分を加えたのですが・・・。 >また、今回に関しては本質的な問題ではないですが、ConDBの実装もあのままではまずいと思います。 これはセキュリティ関係の問題でしょうか? ソースを見てもどの当たりがまずいのかが分かりません。 | ||||
|
投稿日時: 2004-07-23 15:28
PostgresのCVSログを見ていておやっと思ったのですが、Statementクラスのリビジョン1.17の
ログに、 「Removed error message that was incorectly being issued. This fixes a problem reported a few months ago where a select in a rule was causing an insert statement to return a result set which the code was explicitly prohibiting.」 とありました。バグレポートがどこにあるのかわかりませんが、今回の問題に該当するように 思われます。ですが、なぜか1.18(最新版?)では1.17で削除された部分が復活しています… もしかするとドライバを変えたら問題が出なくなるかも知れませんね。
以下のような場合を想定してください。 ConDB db = new ConDB(); Connection conn1 = db.getConnection(); … conn1.close(); Connection conn2 = db.getConnection(); で、このコネクションを使ったらどうなるでしょうか? これ以外にも、オブジェクトのライフサイクルを考慮していないコーディングが目立ちます。 [ メッセージ編集済み 編集者: uk 編集日時 2004-07-23 16:21 ] | ||||
|
投稿日時: 2004-07-23 15:28
SQLExceptionなのでServletとかmainとかの問題ではないと思いましたが
できるって証明をしたかったので早速Servletで作ってみました。 何回も普通に動きましたよ。 きっと他の問題だと思いますけどね。 適当に作ったソースもちゃんと動いますけど。。 エラーの場合もcloseちゃんとしてますよね? 直接SEASONさんの環境でやってみたいですね。 もう少し頑張りましょう。 解決しなきゃ!! ソースの一部分です。 public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); //formの入力値取得 String id = req.getParameter("ID" ); Connection conn = null; String url = "jdbc:postgresql://localhost:5432/template1"; String user = "XXX"; String pwd = ""; String sql = null; Statement stmt = null; try{ Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection(url, user, pwd ); stmt = conn.createStatement(); sql = "insert into USR values('" + id + "','aaa','111')"; int rs = stmt.executeUpdate(sql); System.out.println("sql : " + sql); System.out.println("rs : " + String.valueOf(rs)); stmt.close(); conn.close(); conn = null; } catch( Exception e ) { [ メッセージ編集済み 編集者: MUSE 編集日時 2004-07-23 15:31 ] | ||||
|
投稿日時: 2004-07-24 01:58
ごめんなさい。勘違いしていたので、削除しました。
[ メッセージ編集済み 編集者: よねKEN 編集日時 2004-07-24 02:03 ] [ メッセージ編集済み 編集者: よねKEN 編集日時 2004-07-24 02:03 ] | ||||
