2012-11-07 131 views
2

我一直在谷歌和堆棧溢出過去幾個小時,似乎無法找到一個完全匹配在這個問題上。我對Java相對來說比較陌生,所以如果我只是在做一些非常愚蠢的事情,請糾正我的錯誤!有效的SQL使用臨時表返回沒有結果集

問題:當執行一個try-與資源查詢(Statement.executeQuery的(語句))我得到一個「聲明沒有返回結果集」

我可以保證這是有效的SQL,而當運行SSMS查詢的工作原理 - 當從樣式語法中使用select ... into ...時,此查詢也可以[在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」 <剪斷>

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>

稍後在下面使用的... <剪斷>

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>

我」什麼m期望的是一個緩存結果集,將用於defaulttablemodel中顯示「loannum」字段,值爲1 - wh在我真正得到的是以下錯誤:「com.microsoft.sqlserver.jdbc.SQLServerException:聲明沒有返回結果集......」

如果我修改SQL以下:

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

我得到值爲1的「loannum」的預期回報結果。

它似乎與executeQuery方法中的create table語句有關,但它是一個臨時表!有什麼辦法使上面的工作與創建表(值類型,值類型,值類型)插入...方法?

**注意:我試圖使用.execute(String)方法,並通過返回結果進行解析。它似乎有同樣的問題,但它是完全可能的,我錯誤地實施它。

**備註:defaulttablemodel工作正常,並將信息返回給顯示在屏幕上的JTable。這會動態分配列名稱,並顯示關聯的值。如果需要,我可以提供此代碼的示例,但我不認爲它與問題相關,因爲這在簡單創建結果集時失敗,而不是在嘗試將信息分配給表模型時。

[編輯此文件]:在這種情況下,SQL端的存儲過程不是一個可行的選項。這是針對數據倉庫的查詢,它不允許存儲過程作爲公司策略(我已經推回去,並已被打倒) - 因此,我正在研究這個......駭客解決方案。

希望有人對此問題有所瞭解!

+0

你可能想要麼'布爾執行(字符串SQL)'或' int [] executeBatch(String sql)' –

+0

您能提供一個示例嗎?我試圖實施位於此處的解決方案:http://blogs.msdn.com/b/jdbcteam/archive/2008/08/01/use-execute-and-getmoreresults-methods-for-those-pesky-complex-sql -queries.aspx 並且無法讓它返回結果。它繼續顯示'0結果' – MasaMuneWoS

+0

它看起來像第二個SQL正在做你想要的,那麼第一個SQL給你,第二個SQL不是什麼? –

回答

0

事實證明,在我更新爲使用execute命令之後,我不小心將它包含到try-with-resources塊中,導致返回一個封閉的數據集給調用函數,然後這個函數會出錯傳遞結果集來創建默認表模型。哎呦。

最終,執行查詢用下面的工作(重構和清理還是有必要的,這只是「搞不定」):

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(); 
     }