1

私が抱えている問題は、3つのテーブル(SQL)からデータを取得し、それらをhtmlテーブルに出力するサーブレットを作成することです。

テーブルの構造は次のとおりです。

blog_comments:

row id (auto increments), 
blogger id, 
entry_tstamp, 
t_stamp, 
comment, 
author_id, 

blog_entries:

row id(auto increments), 
blogger_id, 
timestamp, 
entry, 

blogger_info:

row id(auto increments), 
blogger_id, 
name, 
email address, 
image, 
password, 

ブログエントリは元の投稿であり、blog_commentsはその投稿に関連しています。ブロガーの詳細と、それに続く1行目と2行目以下のブログへの関連コメントの投稿(blog_entriesから)を表示するテーブルを作成しようとしています。

whileステートメントを使用しようとしています(以下を参照)。最初にブログの投稿とブロガーIDを取得するためにwhileステートメントを使用し、それに関連するコメントを表示するために2番目のステートメントを使用する必要がありました。

2番目のwhileループを通過し、最初のwhileループを(1インクリメント後に)キャンセルしてから、2番目のwhileループの内容をダンプするので問題が発生します。

これを実装するより良い方法があるかどうか誰かが知っていますか?比較ループを使用する必要がありますか?そして、私のコーディングは間違っていると確信しています。誰かが私がどこで間違っているのか教えてもらえますか?

ありがとうございました。

コード:

        try {
            Class.forName("org.sqlite.JDBC");
            con = DriverManager.getConnection("jdbc:sqlite:E:/My Documents/NetBeansProjects/co2509blog.sqlite");
            stmt = con.createStatement();
            //String temp = "SELECT entry, name, email, image, comment from blog_comments C, blog_entries E, blogger_info I where E.blogger_id = I.blogger_id  AND I.blogger_id = C.author_id ORDER BY E.timestamp";
            //String temp = "SELECT entry, name, email, image from blog_entries E, blogger_info I where E.blogger_id = I.blogger_id ORDER BY E.timestamp";
            //String temp = "SELECT entry, name, email, image, comment from blogger_info I JOIN blog_entries E ON I.blogger_id = E.blogger_id JOIN blog_comments C ON I.blogger_id = C.author_id WHERE  E.timestamp = C.entry_tstamp ORDER BY E.timestamp";
            String query = "SELECT name, image, email, entry FROM blogger_info I, blog_entries E WHERE I.blogger_id = E.blogger_id ORDER BY E.timestamp";
            String query2 = "SELECT name, image, email, comment FROM blogger_info I, blog_entries E, blog_comments C WHERE I.blogger_id = C.author_id AND E.timestamp = C.entry_tstamp ORDER BY E.timestamp";
            rs = stmt.executeQuery(query);


            //rs2 = stmt.executeQuery(secondQuery);
            // displaying records
            int rowCount = 0;
            int rowCount2 = 0;

            out.println("<P ALIGN='center'><TABLE BORDER=5>");
            ResultSetMetaData rsmetadata = rs.getMetaData();
            int columnCount = rsmetadata.getColumnCount();
            // table header
            out.println("<TR>");
            for (int i = 0; i < columnCount; i++) {
                out.println("<TH>" + rsmetadata.getColumnLabel(i + 1) + "</TH>");
            }
            out.println("</TR>");
            {
                while (rs.next()) {
                    rowCount++;
                    out.println("<TR>");
                    for (int i = 0; i < columnCount; i++) {
                        out.println("<TD>" + rs.getString(i + 1) + "</TD>");
                    }
                    rowCount2++;
                    rs2 = stmt.executeQuery(query2);
                    ResultSetMetaData rsmetadata2 = rs2.getMetaData();
                    int columnCount2 = rsmetadata2.getColumnCount();

                    rsmetadata2 = rs2.getMetaData();
                    out.println("</TR>");
                    while (rs2.next()) {
                        rowCount2++;
                        out.println("<TR>");
                        for (int j = 0; j < columnCount2; j++) {
                            out.println("<TD>" + rs2.getString(j + 1) + "</TD>");
                        }

                    }

                }
                out.println("</TR>");
            }
            out.println("</TABLE></P>");

        }
4

1 に答える 1

1

次の行は、最初のクエリのステートメントを再利用します。

rs2 = stmt.executeQuery(query2);

副作用として、最初の結果セット(rs)が閉じられます。

これを修正するには、内部クエリ用に別のステートメントを作成する必要があります。

stmt2 = con.createStatement();

..

rs2 = stmt2.executeQuery(query2);

ただし、2つのクエリを1つのクエリにマージできれば、さらに効率的です。

于 2012-12-14T13:23:21.690 に答える