2017-07-03 4 views
0
  • 私は前の質問を読んだことがありますが、最初は似ているかもしれませんが、私の問題と一致するものはありません。 :/ _

私はJava(JDBC)上のローカルデータベースで作業しています。ボタンを押すと、「SELECT」クエリの結果が得られるはずです。これまでのところとても良いですが、私の初心者の脳が理解できない何らかの理由で、私はをクエリの1つの行にしています。私は "DB Browser for SQLite"で同じ正確なクエリを実行しても正しい結果(1行以上)を返します。 これは、私は、クエリの結果を取得するために使用しています方法です。この方法は、クラッシュしないSQLiteクエリは1行しか返しませんJDBC Javaデータベース

public ResultSet returnBill(int no) throws SQLException{ 
    String sql = "SELECT * FROM billList WHERE no = " + no + " ;"; 
    ResultSet thisSet = stmt.executeQuery(sql); // stmt is a 'Statement' type variable 
    return thisSet; 
} 

それだけで2つ以上(しばらく(返す必要がありますクエリの非常に最初の行を返します。 thisSet.next()) RUNS ONCE)。私は他の "SELECT"クエリを実行して、複数の行を返すことになっています。これらはすべて正常に動作するので、接続の開始/終了ができないという問題ではありません。

以下はメソッドです使用:

int number = table.getModel().getValueAt(rows, 0);        
ResultSet thisSet = db.returnBill(number); 
while (thisSet.next()){ 
     String name = thisSet.getString("name"); 
     int quantity = thisSet.getInt("quantity"); 
     // do something with the returned data 
} 

だから私は(もちろん私は-1、などそれは0ではないことを確認しました)、私はその番号を使用してクエリを実行し、テーブルからこの魔法の数を取得します。あなたは列からなるテーブルの構造を考えることができます:

number |名前|数量|

ここで、 'number'はゼロ以外です。 この方法を使用してDB上でクエリを実行すると、おそらく安全でないかもしれないし、セキュリティの脅威が出るかもしれないが、今はそうではないことを理解しています。私はすでにこのプロジェクトをかなり長い間働いており、私は多くのばかげたミスを経験しており、これはまだ彼らの1つだと思います。どんな助けも是認されています! :D

+0

コードをデバッグしていますか?あなたがテーブルから与える価値(数字の価値)?与えられた値を持つデータベースに複数の行が存在しますか? –

+0

@ hadi。テーブルが適切な数を与えることを、私はそれを試しました。私はまた、 "SQL"文字列を印刷する、クエリが正しいです。はい、私は同じクエリを実行するいくつかの外部ソフトウェア "DB Browser for SQLite"でデータベースを閲覧したため、データベースに複数の行が存在します。 –

+0

コードが例外をスローしていませんか?デバッガでステップ実行してみてください –

答えて

0

だから私は期待通りに愚かな間違いだった。 だから以前に、次のコードの最後に閉じられることになる2つのクエリ(SELECTクエリと示されるように別のテーブルでUPDATEクエリ)のデータベースを開いた可変

Database db = new Database(); 

を開始しました。

ただし、このUPDATEクエリを削除したときにループが正しい回数実行されました。 SQLiteのJDBCは何とか同じ声明にSELECTとUPDATEクエリを実行する傾向があるようなので、それはだから私は非常に先頭に2つの接続を作成し

(限り私のスーパーメガとして*脳がそれを知覚する。)ようで、 SELECTUPDATEクエリの他の1のためにそれらのいずれかを使用して、最後にそれらを閉じて:

Database db = new Database(); // open database 
Database db2 = new Database(); // open another creepy one :/ 

int number = table.getModel().getValueAt(rows, 0);        
ResultSet thisSet = db.returnBill(number); 
while (thisSet.next()){ 
     String name = thisSet.getString("name"); 
     int quantity = thisSet.getInt("quantity"); 
     // do something with the returned data 
     // --------> STUPIDO <---------- 
     //** Now executing an UPDATE query on db2 : 
     // ex.: UPDATE anotherTable SET amount = (current+ "+ quantity+") WHERE name= '" + name+ "' ;"; 
} 
db.closeConn(); // close db ++ 
db2.closeConn(); // closes db 2 

これが最善のアプローチである場合、私は知らないが、それは私の問題を解決し、私はそれを残しているのでおそらくそれは助けることができます。しかし、どんな提案も歓迎されるでしょう:D

+0

単一のトランザクションで両方のステートメントを持つことができるように、間違いなく単一の接続を使用する必要があります。 2つの異なるステートメントオブジェクトを使用しましたか? –

+0

結果セットを処理した後、結果セットを反復処理しているときに、同じStatementオブジェクトに対してupdate文を実行すると、結果セットは閉じられます。そのデータベースオブジェクトを使用することは、直感的ではありません。今のように接続やステートメントの管理を隠すことは考慮したくないかもしれません。 –

+0

@MarkRotteveel ResultSetに関連するドキュメントでこれらの仕様を見つけることができませんでした。私のDB接続の詳細なビューを完全に説明するのは難しいです。私は経験の不足のために目に見えるばかげたミスがあることを望んでいたので、私はコード全体を投稿しませんでした。よろしく:D –

関連する問題