Coolfatman(180) ( ) 信誉:98 Blog 这是在写编译器。-------------------------------------- 汗~~
select tb2.teacherName,tb1.studentName from tb2,tb1 where tb2.teacherManageStuent=tb1.studentID cloumnName是tb2.teacherName和tb1.studentName tableName是tb2和tb1 以上如果有as那它会取别名这个我在sqlserver上试验过
解析出结果集里面的colname和tablename
* 1 从databaseMetaData 取出Database元数据
*
* getColumns 检索可在指定类别中使用的表列的描述。
*/
DatabaseMetaData databaseMetaData = DBConn.getMetaData();
RS = databaseMetaData.getColumns("jobcn_boss", null,TableName, null); //jobcn_boss数据库,TableName表
/*
* 2 利用 ResultSetMetaData 查询上面各列各个属性名
*
/*
ResultSetMetaData rsmd = RS.getMetaData();
int ColnumConut = rsmd.getColumnCount(); //还有getColumName(),getColumnType(), ......................
System.out.println(ColnumConut);
for (int i=1; i < ColnumConut+1; i++) {
System.out.println(i+":"+rsmd.getColumnName(i));
}
*/
while (RS.next())
{
colname+=RS.getString("COLUMN_NAME")+",";
coltype+=RS.getString("TYPE_NAME")+",";
colnumber+=RS.getString("COLUMN_SIZE")+",";
}
String [] ColName = colname.split(",");
String [] ColType = coltype.split(",");
String [] ColNumber = colnumber.split(",");
ColType[0]=ColType[0].substring(0,ColType[0].indexOf(" "));
RS.close();
rst=stmt.executeQuery("select * from users");
ResultSetMetaData meta=rst.getMetaData();
int col=meta.getColumnCount();
int i;
for(i=1;i<=col;i++)
{
out.println(meta.getColumnName(i));
out.println(meta.getColumnType(i));
...................
}
这些.......................
是的
还要分析where.....好像太麻烦了吧?
但是太麻烦了
特别是where子句的分析,简直没法进行
在从DatabaseMetaData 的getColumns方法里取得所有列名
然后从sql里找匹配的列名。
汗~~
cloumnName是tb2.teacherName和tb1.studentName
tableName是tb2和tb1
以上如果有as那它会取别名这个我在sqlserver上试验过
ResultSetMetaData getMetaData()
throws SQLException
检索此 ResultSet 对象的列的编号、类型和属性。 返回:
此 ResultSet 对象的列的描述
抛出:
SQLException - 如果发生数据库访问错误
========================ResultSetMetaData.getColumnName
String getColumnName(int column)
throws SQLException
获取指定列的名称。 参数:
column - 第一列是 1,第二个列是 2,……
返回:
列名称
抛出:
SQLException - 如果发生数据库访问错误
=================ResultSetMetaData.getTableName
String getTableName(int column)
throws SQLException
Gets the designated column's table name. Parameters:
column - the first column is 1, the second is 2, ...
Returns:
table name or "" if not applicable
Throws:
SQLException - if a database access error occurs
这种回答不如不要回答啦,到底有没有解决过同类问题啊?楼主,我正好在做这种BT的事情,所以刚好搜到这里,说实话,到目前仍然没有很好的解决办法,我把几个我尝试过的路子拿出来讨论一下。分两部分:【字段名】
这个好办,通过ResultSetMetaData就可以获取每列的字段别名(Alias),而字段别名(Alias)和字段名(Field)之间的对应关系可以通过正则表达式截取字段区域,然后用StringTokenizer以","为分割符……这样分析出一个对照表。
这个分析确实简单,不写代码了,共享一下我截取SQL语句字段区域的正则:
String str = sql.toUpperCase();
str = str.replaceFirst("SELECT \\s*", "");
str = str.replaceAll(" \\s*FROM .+", "");【表名】
这个是让人郁闷的地方,楼上贴的ResultSetMetaData.getTableName()它只是JDBC的规范,实现不实现是各个数据库驱动厂商的事情。
如果他有真正写代码验证,就会发现Oracle的thin根本没有实现这个方法,返回的总是"",我试了Oracle, SQLSvr, MySQL,只有MySQL有实现这个方法,所以此路不通……象上面那样搞个对照表如何?万一遇到"SELECT A.*, B.* FROM ..."这样的语句,#$#$#%^&,呵呵。
所以我只能规定一个SQL语句里面只能用一个".*",例如"SELECT A.CODE, B.*, C.NAME FROM ..."这种语句中,可以通过自己做一个词法解析器计算出A的字段个数和对应关系,C的字段个数和对应关系,然后在查询后用ResultSetMetaData.getColumnCount()扣减A表和C表的字段数,得到B.*的字段数,这样就形成一个HashMap,key是ColumnIndex,value是TableName。目前这个方案是我能想到的唯一“不用查询两次数据库”的解决方案了,希望对你有帮助,@_@,遇到这种BT的需求……没辙,共勉一下。