public String DBMessage(long id){
String dbdriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url="jdbc:sqlserver://localhost:3333;databaseName=aidb";
String us="sa";
String pw="sa";
String sql="select * from ColumnItem where id="+id+"";

Connection conn=null;
Statement stat=null;
ResultSet rs=null;
StringBuffer sb= new StringBuffer();

try {
Class.forName(dbdriver);
conn=DriverManager.getConnection(url, us, pw);
stat=conn.createStatement();
rs=stat.executeQuery(sql);

while(rs.next()){
ResultSetMetaData rsmd = rs.getMetaData();
int counts = rsmd.getColumnCount();
for (int col = 0; col < counts; col++) {
String colname = rsmd.getColumnName(col+1);
// String colclass=(String) rs.getObject(colname);
sb.append(colname);
sb.append(",");
// sb.append(colclass);
sb.append("\r\n");

System.out.println(colname);
}

// str += rs.getInt("colId");
// str += ",";
// str += rs.getInt("sid");
// str += ",";
// str += rs.getInt("id");
// str += ",";
// str += rs.getString("colCode");
// str += ",";
// str += rs.getString("colName");
// str += ",";
// str += rs.getInt("colPid");
// str += ",";
// str += rs.getInt("colLevel");
// str += ",";
// str += rs.getInt("colType");
// str += ",";
// str += rs.getInt("colLenght");
// str += ",";
// str += rs.getString("colDate");
// str += ",";
// str += rs.getInt("com_id");
// str += ",";
// str += rs.getInt("display");
// str += ",";
// str += rs.getString("formula");
// str += ",";
// str += rs.getInt("isText");
// str += "\r\n";
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sb.toString();
}  for里面应该怎么写才能自动获取到表列和表列的值?现表列已经获取到了,表列的值怎么获取?

解决方案 »

  1.   

    rs.getInt(index);
    或者
    rs.getInt("colname");
    不就行了么。
      

  2.   

    colId,75122,
    sid,2,
    id,6763,
    colCode,BQSJ,
    colName,期末数|||实际数,
    colPid,0,
    colLevel,75122,
    colType,0,
    colLenght,0,
    colDate,2010-07-26 10:51:54.193,
    com_id,1,
    display,1,
    formula,null,
    isText,0,colId,75123,
    sid,10,
    id,6763,
    colCode,BNNC,
    colName,年初数,
    colPid,0,
    colLevel,75123,
    colType,0,
    colLenght,0,
    colDate,2010-07-26 10:51:54.193,
    com_id,1,
    display,1,
    formula,null,
    isText,0,导出后是这种形式的,我想变成下面这种形式的,应该怎么处理一下?
    colId, sid, id, colCode, colName, colPid, colLevel, colType, colLenght, colDate, com_id, 75122,2,6763,BQSJ,期末数|||实际数,0,75122,0,0,2010-07-26 10:51:54.193,1,1,NULL,0
    75123,10,6763,BNNC,年初数,0,75123,0,0,2010-07-26 10:51:54.193,1,1,NULL,0
      

  3.   

    排版问题
    for (int col = 0; col < counts; col++) {

    String colname = rsmd.getColumnName(col+1);
    String coltype=rs.getString(colname);
    sb.append(colname);
    sb.append(",");
    sb.append(coltype);
    sb.append(",");
    sb.append("\r\n");

    }不行。
      

  4.   


    public class Test{
    public String DBMessage(long id){
    String dbdriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
    String url="jdbc:sqlserver://localhost:3333;databaseName=aidb";
    String us="sa";
    String pw="sa";
    String sql="select * from ColumnItem where id="+id+""; Connection conn=null;
    Statement stat=null;
    ResultSet rs=null;
    StringBuffer sb= new StringBuffer(); try {
    Class.forName(dbdriver);
    conn=DriverManager.getConnection(url, us, pw);
    stat=conn.createStatement();
    rs=stat.executeQuery(sql);

    while(rs.next()){
    ResultSetMetaData rsmd = rs.getMetaData();
    int counts = rsmd.getColumnCount();
    for (int col = 0; col < counts; col++) {
    String colname = rsmd.getColumnName(col+1);
    sb.append(rsmd.getColumnName(col+1)+",");
    System.out.println(colname);
    }
    sb.setLength(sb.length()-1);
    sb.append("\r\n");
    while(rs.next()){
     sb.append(rs.getInt("colId")+",");
     sb.append(rs.getInt("sid")+",");
     //....自己写
     sb.setLength(sb.length()-1);
     sb.append("\r\n");
    }
    }
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return sb.toString();

    }
    //楼主这问题还在纠结啊?排版很简单啊,难得是取数据
      

  5.   

    //  str += rs.getInt("colId");
    //  str += ",";
    //  str += rs.getInt("sid");
    //  str += ",";
    //  str += rs.getInt("id");
    //  str += ",";
    //  str += rs.getString("colCode");
    //  str += ",";
    //  str += rs.getString("colName");
    //  str += ",";
    //  str += rs.getInt("colPid");
    //  str += ",";
    //  str += rs.getInt("colLevel");
    //  str += ",";
    //  str += rs.getInt("colType");
    //  str += ",";
    //  str += rs.getInt("colLenght");
    //  str += ",";
    //  str += rs.getString("colDate");
    //  str += ",";
    //  str += rs.getInt("com_id");
    //  str += ",";
    //  str += rs.getInt("display");
    //  str += ",";
    //  str += rs.getString("formula");
    //  str += ",";
    //  str += rs.getInt("isText");
    //  str += "\r\n";
    要是这样的话,你已经给了我答案了,就是上面这种。但是它不是活的、要是换个表查的话就需要改代码,不方便所以...
      

  6.   

    那rs.getInt(1),灵活吗?
    while(rs.next()){
    for(int i=0;i<counts;i++){
    sb.append(rs.getObject(i)+",");}  
    }
    楼主要求蛮多的,我不保证正确性,只是提供这种方法你试试。
      

  7.   

     这样取出的值是空的。这样排版是没问题。但是取数不到了
    itId,id,code,itemName,itPid,itemLevel,attribute,calculationFormula,com_id,itemBackupName,display,isRectItem,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
    null,
      

  8.   


    还有个办法算不错,要加很多代码。
    string[] type = rsmd.getColumnType(column);
    取出来之后
    while(rs.next()){
    for(int i=0;i<counts;i++){
    switch(rsmd.getColumnTypeName(i)){
    case “String”:sb.append(rs.getString(i)+",");break;//自己查api 
    case  :
    case  :
    case  :
    case  :
    case  :
    case  :
    }
    //挺复杂的,你要是能把所以类型列出来,代码可重用行就高了。
    //估计你又有意见了。。
    }   
      

  9.   

    //嫌这种麻烦可以用反射机制
    while(rs.next()){
     for(int i=0;i<counts;i++){
    try {
    methodName = "get"+ 
    rsmd.getColumnTypeName(i).substring(0,1).toUpperCase()
    + rsmd.getColumnTypeName(i).substring(1);
    //单独写个方法处理字母大小写问题,或者跟我这样。如果有问题,你打印出来看,//只要能得到方法名就可以,比如getString;
    Method m=rs.getClass().getMethod(methodName, Integer.class);
    //反射原理,第二参数是方法里面的参数的类型
    sb.append(m.invoke(i)+",");
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    e.printStackTrace();
    } catch (SecurityException e) {
    e.printStackTrace();
    } catch (NoSuchMethodException e) {
    e.printStackTrace();
    }
     }   
     }
      

  10.   


    继续纠正
    这个方法不熟,原理自己查吧,m.invoke(rs,i);
    rs 是ResultSet 的一个实例。
    没时间别深究,知道原理有这么回事,查查google,查查api能写出来就可以了。
      

  11.   

    while(rs.next()){
    ResultSetMetaData rsmd = rs.getMetaData();
    int counts = rsmd.getColumnCount();

    for(int col=0; col < counts; col++) {
    String colname = rsmd.getColumnName(col+1);
    String colvalue=rs.getString(colname);
    sb.append(colname);
    sb.append(",");
    sb.append(colvalue);
    sb.append(",");
    }
    sb.append("\r\n");
    }
    }测试了多次,还是不行啊...
    String colname = rsmd.getColumnName(col+1);要是放在for里面就不对、每执行一次就把列名读取一次,没必要。要是放在for外面while里面它就只取第一列,后面的列名就没取了。这是怎么回事?for外面是这样
    itId,272425,,272425,,272425,,272425,,272425,,272425,,272425,,272425,,272425,,272425,,272425,,272425,
    for里面是这样itId,272425,id,6763,code,1217001,itemName,一年内到期的长期负债,itPid,0,itemLevel,272425,attribute,0,calculationFormula,31323130313030,com_id,null,itemBackupName,null,display,1,isRectItem,null,
    itId,272426,id,6763,code,1218001,itemName,其他流动负债,itPid,0,itemLevel,272426,attribute,0,calculationFormula,31323130313030,com_id,null,itemBackupName,null,display,1,isRectItem,null,
    itId,272427,id,6763,code,1210100,itemName,  流动负债合计,itPid,0,itemLevel,272427,attribute,0,calculationFormula,313230303130303D313231323030312B313231323230312B313231323230322B313231323230332B313231323135312B313231323135332B313231323233322B313231323137312B313231323137362B313231323234312B313231323139312B313232323830312B313231373030312B31323138303031,com_id,null,itemBackupName,null,display,1,isRectItem,null,
    itId,272428,id,6763,code,1222501,itemName,长期借款,itPid,0,itemLevel,272428,attribute,0,calculationFormula,31323230313030,com_id,null,itemBackupName,null,display,1,isRectItem,null,
    itId,272429,id,6763,code,1222502,itemName,应付债券,itPid,0,itemLevel,272429,attribute,0,calculationFormula,31323230313030,com_id,null,itemBackupName,null,display,1,isRectItem,null,
    itId,272430,id,6763,code,1222701,itemName,长期应付
      

  12.   

    本来就要放外面啊。。
    哦,那段是我copy你的代码没注意。            while(rs.next()){
                    ResultSetMetaData rsmd = rs.getMetaData();
                    int counts = rsmd.getColumnCount();
                    for (int col = 0; col < counts; col++) {
                        String colname = rsmd.getColumnName(col+1);
                        sb.append(rsmd.getColumnName(col+1)+",");
                        System.out.println(colname);
                    }
    不要循环。把这段中的while语句去掉