2

私は過去数時間グーグルとスタックオーバーフローを検索してきましたが、この問題に完全に一致するものを見つけることができないようです。私はJavaに比較的慣れていないので、信じられないほどばかげたことをしているだけの場合は訂正してください。

問題:リソースを使用した試行クエリ(statement.executeQuery(stmt))を実行すると、「ステートメントが結果セットを返さなかった」というメッセージが表示されます。

これが有効なSQLであることを保証できます。また、SSMSを実行すると、クエリが機能します。select... into ... fromスタイルの構文を使用すると、このクエリも[java]で機能します。select ... into ... fromは、パフォーマンスの問題を引き起こすため、実行可能なオプションではありません(23秒のクエリはリソース使用率のために5分以上のクエリになります)

概念実証:SQLファイル:c:\ test.sql

set nocount on
create table #test (loannum int)
insert into #test (loannum)
select 1
select * from #test
drop table #test

このクエリは、データベースへの接続を開いたままにすることなく、他の関数にデータを渡すことができるように、キャッシュされた結果セットを作成するために使用されます...

注:以下のSQLInfoは、「C:\test.sql」 <snip>です。

try(BufferedReader in = new BufferedReader(new FileReader(SQLInfo)))
                {
                    String str;
                    StringBuffer sb = new StringBuffer();
                    while((str = in.readLine()) != null)
                    {
                        sb.append(str + System.getProperty("line.separator"));
                    }

                    _stmt = sb.toString();
                }

</ snip>

これは後で以下で使用されます...<snip>

try (Connection connection = DriverManager.getConnection(CONNECTION);
                Statement statement = connection.createStatement();
                ResultSet resultset = statement.executeQuery(_stmt)
            ) 
        {

            crs.populate(resultset);

            return crs;
        }
        catch (SQLException e) 
        {
            e.printStackTrace();
        }
        return crs;

</ snip>

私が期待しているのは、「loannum」フィールドを表示するためにdefaulttablemodelで使用されるキャッシュされた結果セットであり、値は1です。実際に取得するのは次のエラーです:「com.microsoft.sqlserver.jdbc。 SQLServerException:ステートメントが結果セットを返しませんでした...」

SQLを次のように変更した場合:

set nocount on
select 1 as loannum
into #test
select * from #test
drop table #test

値が1の「loannum」の期待収益結果が得られます。

executeQueryメソッドのcreatetableステートメントと関係があるように見えますが、これは一時テーブルです。上記をcreatetable(value type、value type、value type)insert into ...メソッドで機能させる方法はありますか?

**注:.execute(String)メソッドを使用して、返された結果を解析しようとしました。同じ問題があるようですが、間違って実装している可能性があります。

** 2番目の注意:defaulttablemodelは正常に機能し、画面に表示されるJTableに情報を返します。これにより、列名が動的に割り当てられ、関連する値が表示されます。必要に応じてこのコードのサンプルを提供できますが、テーブルモデルに情報を割り当てようとしているときではなく、結果セットを作成するだけでは失敗するため、この問題には関連しないと思います。

[これを編集する]:この場合、SQL側のストアドプロシージャは実行可能なオプションではありません。これは、会社のポリシーとしてストアドプロシージャを許可しないデータウェアハウスに対するクエリです(私はプッシュバックし、打ちのめされました)-その結果、私はこの...ハックなソリューションに取り組んでいます。

うまくいけば、誰かがこの問題について何らかの洞察を持っているでしょう!

4

1 に答える 1

0

結局のところ、execute コマンドを使用するように更新した後、誤ってそれを try-with-resources ブロックに含めてしまい、その結果、閉じたデータセットが呼び出し関数に返され、create に渡された空の結果セットでエラーが発生しました。デフォルトのテーブル モデル。おっと。

最終的に、実行クエリは次のように機能しました (リファクタリングとクリーンアップはまだ必要ですが、これは「機能させる」だけでした)。

try 
        {
            boolean hasResults = statement.execute(_stmt);

            do { //I think... this could only possibly get one result. FIXME

            if (hasResults) 
            {
                try(ResultSet rs = statement.getResultSet())
                {
                    CachedRowSetImpl crs = new CachedRowSetImpl();
                    crs.populate(rs);

                    return crs;
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }

            hasResults = statement.getMoreResults();

            } while (hasResults || statement.getUpdateCount() != -1);

            } 
        catch (Exception e) 
        {
            e.printStackTrace();
        } 
        finally 
        {
            statement.close();
        }
于 2012-11-08T22:40:21.573 に答える