2014-02-11 100 views
3

我想循環使用下面的代碼得到一個錯誤的數據庫的表java.lang.UnsupportedOperationException。我甚至嘗試用cfloop query and other attributes得到的錯誤複雜的值不能轉換爲簡單的值。任何人都可以告訴我該如何循環查詢?謝謝。如何遍歷數據庫的表?

<cfquery name="q" datasource="datasource"> 
    SHOW TABLES FROM datasource 
</cfquery> 
<cfloop collection ="#q#" item="i"> 
    #q[i]# 
</cfloop> 
+0

您正在使用哪些DBMS? MySQL的?你試過只是傾銷查詢?它會返回任何東西嗎? –

+0

@SeanCoyne - 我正在使用MySQL我做了轉儲,它顯示了所有表名... –

回答

5

您正在收到該錯誤,因爲cfloop collection需要一個結構,而不是查詢對象。因此,「UnsupportedOperation ...」錯誤。

而應該使用查詢循環。生成的列名是動態的,基於您提供的數據庫名稱。您可以硬編碼或動態訪問它:

<cfset colNames = listToArray(q.columnList)> 
    <cfoutput query="q"> 
     <cfloop array="#colName#" index="col"> 
      #q[col][currentRow]# 
     </cfloop> 
     <br> 
    </cfoutput> 

這麼說,我覺得它更容易使用metadata INFORMATION_SCHEMA views。你可以像任何表一樣查詢它們。然後照常輸出靜態列名。

<cfquery name="yourQueryName" ...> 
     SELECT TABLE_NAME 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_SCHEMA = 'YourDatabaseName' 
    </cfquery> 

    <cfoutput query="yourQueryName"> 
     #TABLE_NAME# <br> 
    </cfoutput> 
+0

謝謝Leigh ...這真的很棒的答案。你能告訴我怎樣才能得到所有表的列名? –

+2

請查詢['INFORMATION_SCHEMA.COLUMNS'](http://dev.mysql.com/doc/refman/5.0/en/columns-table.html)視圖。要獲得單個表的列,只需過濾'TABLE_NAME'而不是模式。即'...... WHERE TABLE_NAME ='一些表'# – Leigh

+2

其實我回過頭來。你應該過濾* * table_name'和'table_schema'。以防在多個數據庫中存在相同的'table_name'。 – Leigh

0

如何

<cfoutput query="q"> 
#tables# 
<cfoutput> 
+0

表在tables_in_database列....它不工作。當我轉儲它時,我沒有發現除了tables_in_nameofdb以外的任何列名稱。 –

1

你試過CFDBINFO?它支持一種'tabes',並且應該返回給你一個關於每個表的表名,類型和備註的查詢。