2014-02-11 61 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',并且应该返回给你一个关于每个表的表名,类型和备注的查询。