7

機能に問題がありgetFetchSize()ます。

SQLクエリがゼロ行を返したかどうかを知る必要があります。

私はこの簡単なステートメントを試しました:

if (rs.getFetchSize()==0)
    System.out.println("HEADLINE");

はタイプですrsResultSet上記のコードは機能していないようです。rs空かどうかに関係なく、常にメッセージを出力します。

SQLクエリ自体を確認したところ、行が存在する場合は空でない結果が正しく返されました。

クエリが0行を返したかどうかを判断する方法について何か考えはありますか?私はそれをグーグルで検索しましたが、答えが見つかりませんでした。

4

6 に答える 6

24

ResultSet.getFetchSize()が結果の数を返さない! ここから:

標準 JDBC では、クエリの各データベース ラウンドトリップでフェッチされる行数を指定することもできます。この数はフェッチ サイズと呼ばれます。

結果セット全体を反復処理できます。エントリがない場合は、結果が得られなかったと判断できます。結果のサイズをすぐに取得できないのはなぜですか? データベースは結果へのポインターを返し、それを反復処理する必要があるためです (行ごとにサーバーに戻ります)。

于 2013-01-11T10:34:59.430 に答える
4

フェッチ サイズは、各ラウンドトリップでデータベースから取得する必要がある行数です。返される行数とは関係ありません。

すべきことは、rs.next() を呼び出すことです。クエリが行を返さなかった場合は、false が返されます。

于 2013-01-11T10:37:54.890 に答える
3

実際、あなたが探していることを行う別の方法はこれだと思います:

Class.forName("org.exempleDatabase.Driver");
Connection  conn = DriverManager.getConnection("jdbc:exempleDatabase:/../smartytwiti", "username", "password");
ResultSet resset = conn.createStatement().executeQuery("select count(*) from yourTable;");
resset.last();
int resnum = resset.getRow();
if(resnum<1)System.out.println("HEADLINE");

これは ResultSet を取得し、セットの最後の行に移動してから、その行の番号をresnumに指定します。resset.next( )で結果を反復処理する場合は、必ず resset.beforeFirst()で戻ってください。

それが役立つことを願っています。

于 2015-12-02T23:01:28.597 に答える
1

SQL Serverでは、SQLクエリに入れることができます:

COUNT(*) OVER(PARTITION BY 1)

ここみたいに:

select COUNT(*) OVER(PARTITION BY 1) as NUM,ident as ID,employee as EMP from invoice where date between '2017-01-01 00:00:00.000' and '2017-01-31 00:00:00.000'

そして、次のような結果が得られます。

NUM, ID,    EMP
4,   28912, JOHN
4,   28913, JOHN
4,   28914, ADAM
4,   28915, PETER

そして今、すべてのデータを処理する前に、最初の列と最初のセルのみを読み取ってレコード数を取得できます。結果を格納するオブジェクト配列 [invoices] は、喉の渇きの結果を取得している間に一度だけ宣言されます。

Object[][] invoices = null;
Boolean b_inv = false;
[...]
try {
        Statement stmt = db_conn.createStatement();
        boolean results = stmt.execute(sql_query);

        if (results) {
            try (ResultSet rs1 = stmt.getResultSet()) {
                Integer l = 0;

                while (rs1.next()) {
                    if (!b_inv) {
                        invoices = new Object[rs1.getInt(1)][2];
                        b_inv = true;
                    }
                    invoices[l][0] = rs1.getInt(1);
                    invoices[l][1] = rs1.getString(2);
                    l++;
                }
            }
            stmt.close();
        }
    } catch (SQLException | NumberFormatException dbsi1) {}

SQL Server 側にレコードのカウントを入れるのはよくないですか?

于 2017-02-10T09:33:55.023 に答える
0

このコードを使用して、探していることを実行できます。

        Class.forName("org.exempleDatabase.Driver");

        Connection  conn = DriverManager.getConnection("jdbc:exempleDatabase:/../smartytwiti", "username", "password");

        ResultSet resset = conn.createStatement().executeQuery("select count(*) from yourTable;");

        resset.next();//set the pointer to the first row(important!)

        if(resset.getInt(1)==0)
            System.out.println("HEADLINE");
于 2014-01-16T13:35:06.790 に答える