回lastsweetop 兄弟 异常捕获了 返回的就是空值
解决方案 »
- 求助:tomcat的jvm配置到1G启动正常,但是大于1G就无法启动
- 我被这个问题弄到头都大了
- 请前辈给点意见
- struts2 请求action方法,请求不到
- 关于HttpClient访问自己的web service
- spring+hibernate+struts 如何从 jsp 页面上获得spring DAO中的方法
- 加载hibernate.cf.xml时的问题,请看下....
- shopxx 2010 struct升级的问题
- 有个疑问请高手解决
- 高手指点:java访问 wsdl文件。
- 紧急帮忙啊,The server encountered an unexpected condition which prevented it from fulfilling the request.
- struts2.0 和 webwork 区别是什么?
public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:test", "t", "t");
Statement stmt = conn.createStatement();
ResultSet rs = stmt
.executeQuery("select po.id,po.port,ag.agent_full_name from " +
" t_flying_port po,t_flying_agent ag where po.agent_id=ag.agent_id ");
ResultSetMetaData rsmd = rs.getMetaData();
OracleResultSetMetaData orsmd = (OracleResultSetMetaData) rs.getMetaData();
orsmd.isSearchable(1);
int num = rsmd.getColumnCount();
for (int i = 0; i <num; i++) {
System.out.println("=========第"+i+"列信息=========");
System.out.println("rsmd.getColumnClassName("+(i+1)+")--->"+orsmd.getColumnClassName(i+1));
System.out.println("rsmd.getCatalogName("+(i+1)+")--->"+orsmd.getCatalogName(i+1));
System.out.println("rsmd.getSchemaName("+(i+1)+")--->"+orsmd.getSchemaName(i+1));
System.out.println("rsmd.getColumnLabel("+(i+1)+")--->"+orsmd.getColumnLabel(i+1));
System.out.println("rsmd.getColumnName("+(i+1)+")--->"+orsmd.getColumnName(i+1));
System.out.println("rsmd.getTableName("+(i+1)+")--->"+orsmd.getTableName(i+1));
System.out.println("rsmd.getColumnTypeName("+(i+1)+")--->"+orsmd.getColumnTypeName(i+1));
System.out.println("===================");
}
} catch (ClassNotFoundException e) { e.printStackTrace();
} catch (SQLException e) { e.printStackTrace();
}
}输出结果:
=========第0列信息=========
rsmd.getColumnClassName(1)--->java.math.BigDecimal
rsmd.getCatalogName(1)--->
rsmd.getSchemaName(1)--->
rsmd.getColumnLabel(1)--->ID
rsmd.getColumnName(1)--->ID
rsmd.getTableName(1)--->
rsmd.getColumnTypeName(1)--->NUMBER
===================
=========第1列信息=========
rsmd.getColumnClassName(2)--->java.lang.String
rsmd.getCatalogName(2)--->
rsmd.getSchemaName(2)--->
rsmd.getColumnLabel(2)--->PORT
rsmd.getColumnName(2)--->PORT
rsmd.getTableName(2)--->
rsmd.getColumnTypeName(2)--->VARCHAR2
===================
=========第2列信息=========
rsmd.getColumnClassName(3)--->java.lang.String
rsmd.getCatalogName(3)--->
rsmd.getSchemaName(3)--->
rsmd.getColumnLabel(3)--->AGENT_FULL_NAME
rsmd.getColumnName(3)--->AGENT_FULL_NAME
rsmd.getTableName(3)--->
rsmd.getColumnTypeName(3)--->VARCHAR2
===================
数据查询结果:
ID PORT AGENT_FULL_NAME
5 500 海尔集团子公司
4 400 TCL集团子公司
1 100 大红鹰集团
2 200 联想集团
3 300 TCL集团
下面是API的部分, column 是从第一列开始的。
--------------------------------------------------------
getTableName
String getTableName(int column)
throws SQLException获取指定列的名称。 参数:
column - 第一列是 1,第二个列是 2,……
返回:
表名称;如果没有可应用的名称,则返回 ""
抛出:
SQLException - 如果发生数据库访问错误--------------------------------------------------------------------------------getCatalogName
String getCatalogName(int column)
throws SQLException获取指定列的表目录名称。 参数:
column - 第一列是 1,第二个列是 2,……
返回:
在其中显示给定列的表的目录名称;如果可应用的名称,则返回 ""
抛出:
SQLException - 如果发生数据库访问错误
package com.cpoysy.test;
import static java.lang.System.*;
/** 导入下面要用到的所有类 */
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Scanner;
public class Client {
/**
* 定义几个全局变量
*/
private Connection con = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private ResultSetMetaData rsmd = null;
private String url = "";
/**
* 首先使用static块加载mysql的驱动,static块里面的代码在 Client类一加载就执行,且只执行一次
*/
static {
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* useMysql方法,功能是使用use命令进入参数指定的数据库
*
* @param dbName
* 数据库名
* @return void
*/
public void useMysql(String dbName) {
url = "jdbc:microsoft:sqlserver://192.168.1.106:1433;DatabaseName=" + dbName;
try {
con = DriverManager.getConnection(url, "sa", "");
out.println("数据库已改变!");
} catch (Exception e) {
out.println("Exception:" + e.getMessage());
}
}
/**
* execute 方法根据参数判断执行指定的命令
*
* @param prefix
* 命令的第一个单词
* @param sql
* 要执行sql语句sql语句
*/
public void execute(String prefix, String sql) {
if (prefix.equals("use")) {
useMysql(sql);
} else if (prefix.equals("show")) {
show(sql);
} else if (prefix.equals("desc")) {
desc(sql);
} else if (prefix.equals("select")) {
select(prefix + " " + sql);
} else if (prefix.equals("update") || prefix.equals("insert") || prefix.equals("delete")) {
update(prefix + " " + sql);
} else {
out.println("错误的命令!");
}
}
/**
* update方法 用于执行update、insert、delete命令
*
* @param sql
* 要执行sql语句
*/
private void update(String sql) {
if (con == null) {
out.println("请先使用use命令!");
} else {
try {
pstmt = con.prepareStatement(sql);
// 如果影响行数不为则说明sql语句执行成功
if (pstmt.executeUpdate(sql) != 0) {
out.println("执行成功!");
}
} catch (Exception e) {
out.println(e.getMessage());
}
}
}
/**
* select 方法,用于执行select语句。此方法写了大量的格式化语
* 句。也使用到了jdk1.5的新语法。那就是System.out.printf()方法。 使用方法和C语言差不多。
*
* @param sql
* 要执行sql语句
*/
private void select(String sql) {
if (con == null) {
out.println("请先使用use命令!");
} else {
try {
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
rsmd = rs.getMetaData();
int j = 15 * rsmd.getColumnCount() + rsmd.getColumnCount() - 1;
out.print("+");
for (int i = 0; i < j; i++)
out.print("-");
out.print("+\n");
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
out.printf("|%-15s", rsmd.getColumnName(i));
}
out.print("|\n+");
for (int i = 0; i < j; i++)
out.print("-");
out.print("+\n");
// 表中数据的信息
while (rs.next()) {
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
out.printf("|%-15s", rs.getObject(i).toString());
}
out.println("|");
}
out.print("+");
for (int i = 0; i < j; i++)
out.print("-");
out.print("+\n");
} catch (Exception e) {
out.println(e.getMessage());
}
}
}
/**
* desc方法,用于查看指定表的具体信息,类似于mysql命令的desc语句的功能
*
* @param table
* 指定的表名
*/
private void desc(String table) {
if (con == null) {
out.println("请先使用use命令!");
} else {
try {
pstmt = con.prepareStatement("select * from " + table);
rs = pstmt.executeQuery();
rsmd = rs.getMetaData();
out.print("+");
for (int i = 0; i < 68; i++)
out.print("-");
out.print("+\n");
out.printf("|%-25s|%-15s|%-10s|%-15s|\n", "Field", "Type",
"Null", "Extra");
out.print("+");
for (int i = 0; i < 68; i++)
out.print("-");
out.print("+\n");
// 表的详细信息
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
out.printf("|%-25s", rsmd.getColumnName(i));
out.printf("|%-15s", rsmd.getColumnTypeName(i) + "("
+ rsmd.getColumnDisplaySize(i) + ")");
out.printf("|%-10s", ((rsmd.isNullable(i) == 1) ? "YES"
: "NO"));
out.printf("|%-15s|\n",
rsmd.isAutoIncrement(i) ? "auto_increment" : "");
}
out.print("+");
for (int i = 0; i < 68; i++)
out.print("-");
out.print("+\n");
} catch (Exception e) {
out.println(e.getMessage());
}
}
}
/**
* show 方法,根据用户输入的信息判断是show tables 还是show databases 再进行处理
*
* @param obj
* 要查看的对象
*/
private void show(String obj) {
if (obj.equals("tables")) {
if (con == null) {
out.println("请先使用use命令!");
} else {
try {
DatabaseMetaData dsmd = con.getMetaData();
rs = dsmd.getTables(null, null, null, null);
out.print("+");
for (int i = 0; i < 78; i++)
out.print("-");
out.print("+\n");
out.printf("|%-27s|%-12s|%-12s|%-12s|", "表名称", "表类别",
"表类型", "表模式");
out.println();
out.print("+");
for (int i = 0; i < 78; i++)
out.print("-");
out.print("+");
out.println();
while (rs.next()) {
out.printf("|%-30s|%-15s|%-15s|%-15s|", rs
.getString("TABLE_NAME"), rs
.getString("TABLE_CAT"), rs
.getString("TABLE_TYPE"), rs
.getString("TABLE_SCHEM"));
out.println();
}
out.print("+");
for (int i = 0; i < 78; i++)
out.print("-");
out.print("+");
out.println();
} catch (Exception e) {
out.println(e.getMessage());
}
}
} else if (obj.equals("databases")) {
try {
url = "jdbc:microsoft:sqlserver://192.168.1.106:1433;DatabaseName=emhr2007";
con = DriverManager.getConnection(url, "sa", "");
DatabaseMetaData dsmd = con.getMetaData();
rs = dsmd.getCatalogs();
out.print("+");
for (int i = 0; i < 30; i++)
out.print("-");
out.print("+");
out.println();
out.printf("|%-30s|\n", "DATABASE");
out.print("+");
for (int i = 0; i < 30; i++)
out.print("-");
out.print("+");
out.println();
while (rs.next()) {
out.printf("|%-30s|\n", rs.getString(1));
}
out.print("+");
for (int i = 0; i < 30; i++)
out.print("-");
out.print("+");
out.println();
} catch (Exception e) {
out.println(e.getMessage());
}
} else {
out.println("错误的命令!");
}
}
public static void main(String[] args) {
/**
* Scanner也是jdk1.5新加进来的一个类,在java.util 包中,具体用法可以查看jdk1.5的API,这里是从键盘获
* 得一个输入流,比用BufferedReader简单的多了。
*/
Scanner scanner = new Scanner(System.in);
Client client = new Client();
out.println("查看所有数据库使用show databases命令");
out.println("进入数据库使用use命令(use databaseName)");
out.println("查看数据库表信息使用show tables命令");
out.println("显示表信息使用desc命令(desc tableName)");
out.println("执行sql命令使用select,update,delete");
out.println("退出请使用 quit ");
String command = "";
while (true) {
try {
out.print("mysql> ");
command = scanner.nextLine();
// 判断输入的命令是否为quit或者QUIT,是则跳出循环,退出程序
if (command.trim().equals("quit")
|| command.trim().equals("QUIT")) {
break;
}
// 使用正则表达式去掉输入字符串的前后空格后再把中间所有超过一
// 个空格的地方转换为一个空格
command = command.trim().replaceAll(" +", " ");
// 经过上面处理后取到命令的第一个关键字
String prefix = command.substring(0, command.indexOf(" "));
String sql = command.substring(command.indexOf(" ") + 1);
client.execute(prefix, sql);
} catch (Exception e) {
out.println(e.getMessage());
}
}
}
}
我恳请诸位 花5分钟测试一下 ResultSetMetaData 类的方法
自己测试后就知道 ResultSetMetaData 的那个方法可以返回值 那个返回"";
API 既然提供了获得查询结果字段的表名 那么就肯定能获得!
而现在返回的是""; 这是为什么呢?如果需要设置什么特定参数 那么在那里设置?
再次感谢诸位!
bea 对 ResultSet 的描述 ResultSetMetaDataOptions 在那里设置?
==============
getTableName() 值呢
既然能返回值 那么可以不可以帖出代码和测试sql 谢谢