1

我在 mysql 数据库中有一个表,在 oracle 数据库中有另一个表。我正在编写一个实用程序来从一个表中获取数据并插入到另一个表中。

以下是我在 swing 中设计的实用工具。

用于选择查询的文本区域;另一个用于插入查询的文本区域;一个称为加载数据的按钮。

现在,如果我单击加载数据,选择查询应该运行并获取数据。并执行插入查询以插入到表中。

注意:因为它是一个实用工具,所以表名是动态的。

我现在面临的问题是插入查询。如何动态查找表的 desc 以便在运行时使用 setString、setLong 或 ect?

4

3 回答 3

1

ResultSetMetaData可以告诉你一个ResultSet(以及一个表):

 ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
 ResultSetMetaData rsmd = rs.getMetaData();
 int numberOfColumns = rsmd.getColumnCount();
 boolean b = rsmd.isSearchable(1);
于 2013-11-06T16:30:15.383 回答
1

这是一个ResultSetMetaData对象如何告诉您您查询的表的示例:

import java.sql.*;

public class JDBCQuery {

    public static void main(String args[]) {
        Connection conn = null;
        Statement s = null;
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            conn = DriverManager.getConnection(
                    "jdbc:odbc:Driver={SQL Server};" + 
                    "Server=.\\SQLEXPRESS;" +
                    "Trusted_Connection=yes;" +
                    "Database=myDb");
            s = conn.createStatement();
            s.executeQuery("SELECT * FROM dbo.SalesSummary WHERE 0 = 1");
            ResultSet rs = s.getResultSet();
            ResultSetMetaData rsmd = rs.getMetaData();
            for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                System.out.println(String.format("-- Column %d --", i));
                System.out.println(String.format("Column name: %s", rsmd.getColumnName(i)));
                System.out.println(String.format("Database-specific type name: %s", rsmd.getColumnTypeName(i)));
                System.out.println(String.format("Column size (DisplaySize): %d", rsmd.getColumnDisplaySize(i)));
                System.out.println(String.format("java.sql.Type of column: %d", rsmd.getColumnType(i)));
                System.out.println();
            }
        } catch( Exception e ) {
            e.printStackTrace();
        } finally {
            try {
                if (s != null) {
                    s.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch( Exception e ) {
                e.printStackTrace();
            }
        }
    }
}

这是输出:

-- Column 1 --
Column name: Item
Database-specific type name: nvarchar
Column size (DisplaySize): 255
java.sql.Type of column: -9

-- Column 2 --
Column name: FiscalYear
Database-specific type name: int
Column size (DisplaySize): 11
java.sql.Type of column: 4

-- Column 3 --
Column name: Quarter
Database-specific type name: int
Column size (DisplaySize): 11
java.sql.Type of column: 4

-- Column 4 --
Column name: Sales
Database-specific type name: money
Column size (DisplaySize): 21
java.sql.Type of column: 3

此处java.sql.Types提供了完整列表。

于 2013-11-06T20:51:29.480 回答
0

这是我最近编写的一些代码,用于动态生成一些脚本。查询数据库元数据以获取有关前缀为 vw_as 的所有视图的信息。您应该能够以此为起点来查询要插入的表并获取其定义。

DataSource ds = ...;
Connection c = ds.getConnection();
DatabaseMetaData metaData = c.getMetaData();

ResultSet rs = metaData.getTables(null, "dbo", "vw_as%", new String[] { "VIEW" });

while (rs.next()) {
    String tableName = rs.getString("TABLE_NAME"));

    ResultSet rs1 = metaData.getColumns(null, "dbo", tableName, "%");

    while (rs1.next()) {
        String columnName = rs1.getString("COLUMN_NAME"));
    }
  }
}
于 2013-11-06T16:34:57.090 回答