2013-11-06 3 views
1

У меня есть 1 таблица в базе данных mysql и другая таблица в базе данных оракула. Я пишу утилиту для получения данных из одной таблицы и вставки в другую таблицу.Динамически вставлять данные в таблицу с помощью JDBC

Ниже представлен мой дизайн утилиты в качелях.

Textarea для выбранного запроса; Другое текстовое поле для запроса на вставку; Кнопка, называемая данными загрузки.

Теперь, если я нажимаю данные загрузки, выберите запрос, который должен выполняться, и забрать данные. И выполните запрос вставки, чтобы вставить его в таблицу.

Примечание: поскольку это утилита, имена таблиц являются динамическими.

Проблема, с которой я столкнулся сейчас, - это вопрос с вставкой. Как я могу динамически найти desc таблицы, чтобы я мог использовать setString, setLong или ect во время выполнения?

ответ

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 имеется here.

+0

Большое спасибо Горд Томпсон. Отлично! – arunan

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); 
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")); 
    } 
    } 
} 
Смежные вопросы