1. 程式人生 > >查詢不同sqlserver資料庫兩張表並比對欄位結構是否相同

查詢不同sqlserver資料庫兩張表並比對欄位結構是否相同

package com.cn.sis;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class CompareDataTable {
    private static String url1="jdbc:sqlserver://chot3r8csts02:1433;DatabaseName=newsis";
    private static String url2="jdbc:sqlserver://CHOWKD1600450\\SIS:1433;DatabaseName=newsis";
    public static Connection getConnection(String url) {
        Connection conn = null;
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//            String url = "jdbc:sqlserver://chot3r8csts02:1433;DatabaseName=newsis";
            String user = "devplogin";
            String pass = "devplogin";
            conn = DriverManager.getConnection(url, user, pass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    //獲取查詢資料結果:欄位名-欄位型別:欄位長度
    public static Map<String,Object> getResult(String tableName,Connection conn){
        Map<String,Object> map = new HashMap<String,Object>();
        String sql="select * from "+tableName;
        PreparedStatement stmt=null;
        ResultSet rs = null;
        try {
            stmt = conn.prepareStatement(sql);
            rs=stmt.executeQuery();
            ResultSetMetaData data=rs.getMetaData();
            while(rs.next()){
                for(int i = 1 ; i<= data.getColumnCount() ; i++){
            //獲得所有列的數目及實際列數
//                int columnCount=data.getColumnCount();
            //獲得指定列的列名
            String columnName = data.getColumnName(i);
            //獲得指定列的列值
//            String columnValue = rs.getString(i);
            //獲得指定列的資料型別
//            int columnType=data.getColumnType(i);
            //獲得指定列的資料型別名
            String columnTypeName=data.getColumnTypeName(i);            
            //所在的Catalog名字
//            String catalogName=data.getCatalogName(i);
            //對應資料型別的類
//            String columnClassName=data.getColumnClassName(i);
            //在資料庫中型別的最大字元個數
//            int columnDisplaySize=data.getColumnDisplaySize(i);
            //預設的列的標題
//            String columnLabel=data.getColumnLabel(i);
            //獲得列的模式
//            String schemaName=data.getSchemaName(i);
            //某列型別的精確度(型別的長度)
            int precision= data.getPrecision(i);
            //小數點後的位數
//            int scale=data.getScale(i);
            //獲取某列對應的表名
//            String tableName=data.getTableName(i);
            // 是否自動遞增
//            boolean isAutoInctement=data.isAutoIncrement(i);
            //在資料庫中是否為貨幣型
//            boolean isCurrency=data.isCurrency(i);
            //是否為空
//            int isNullable=data.isNullable(i);
            //是否為只讀
//            boolean isReadOnly=data.isReadOnly(i);
            //能否出現在where中
//            boolean isSearchable=data.isSearchable(i);
            map.put(columnName+"-"+columnTypeName,precision);
//            System.out.println("該表的欄位長度:"+columnCount);
//            System.out.println("獲得列"+i+"的欄位名稱:"+columnName);
//            System.out.println("獲得列"+i+"的欄位值:"+columnValue);
//            System.out.println("獲得列"+i+"的型別,返回SqlType中的編號:"+columnType);
//            System.out.println("獲得列"+i+"的資料型別名:"+columnTypeName);
//            System.out.println("獲得列"+i+"所在的Catalog名字:"+catalogName);
//             System.out.println("獲得列"+i+"對應資料型別的類:"+columnClassName);
//              System.out.println("獲得列"+i+"在資料庫中型別的最大字元個數:"+columnDisplaySize);
//            System.out.println("獲得列"+i+"的預設的列的標題:"+columnLabel);
//               System.out.println("獲得列"+i+"的模式:"+schemaName);
//               System.out.println("獲得列"+i+"型別的精確度(型別的長度):"+precision);
//            System.out.println("獲得列"+i+"小數點後的位數:"+scale);
//            System.out.println("獲得列"+i+"對應的表名:" + tableName);
//               System.out.println("獲得列"+i+"是否自動遞增:"+isAutoInctement);
//            System.out.println("獲得列"+i+"在資料庫中是否為貨幣型:"+isCurrency);
//            System.out.println("獲得列"+i+"是否為空:"+isNullable);
//            System.out.println("獲得列"+i+"是否為只讀:"+isReadOnly);
//            System.out.println("獲得列"+i+"能否出現在where中:"+isSearchable);  
             }                    
           }
        }catch(SQLException e) {
            System.out.println("資料庫連線失敗");
        }finally{
            SISUtils.closeConnection(conn,stmt,rs);
        }
        return map;
    }
    //比較兩張表的欄位名及欄位型別是否相同
    public static boolean compareMap(Map<String,Object> map1,Map<String,Object> map2){
        if(map1 == null || map2 ==null) return false;
        boolean isEquals = false;
        for(Entry<String,Object> entry1 : map1.entrySet()){
            String key1 = entry1.getKey();
            Object value1 = entry1.getValue();
            for(Entry<String,Object> entry2 : map2.entrySet()){
                String key2 = entry2.getKey();
                Object value2 = entry2.getValue();
                if(key1 == null || "".equals(key1) || value1 ==null || "".equals(value1)
                        || key2 == null || "".equals(key2) || value2 == null || "".equals(value2))
                    return false;
                if(key1.equals(key2) && value1.equals(value2)){
                    isEquals = true;
                    break;
                }                
            }
            if(!isEquals) return isEquals;
        }
        return isEquals;
    }

    public static void main(String[] args){
        String tableName="t_dict";
        Map<String,Object> map1 = getResult(tableName,getConnection(url1));
        Map<String,Object> map2 = getResult(tableName,getConnection(url2));
//        for(Entry<String,Object> entry : map1.entrySet()){
//            System.out.println("欄位名-欄位型別為:"+entry.getKey());
//            System.out.println("該欄位的型別長度為:"+entry.getValue());
//            System.out.printf("%s%n", "------------");
//        }
//        System.out.println("資料存放完畢");
        boolean isEquals = compareMap(map1, map2);
        if(!isEquals)
            System.out.printf("%s%n",tableName+"表字段匹配不上,請檢查兩張資料庫的表對應欄位情況!");
        else
            System.out.printf("%s%n","恭喜你,這兩張表字段名-欄位型別及欄位長度相等!");
        
    }
}

--共有類

package com.cn.sis;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class SISUtils {
    //關閉連線
            public static void closeConnection(Connection con,PreparedStatement pStatement,ResultSet rSet){
                try{
                    if(con != null){
                        con.close();
                    }
                    if(pStatement != null){
                        pStatement.close();
                    }
                    if(rSet != null){
                        rSet.close();
                    }
                }catch(Exception e){
                    System.out.println("關閉連線失敗!");
                }
            }    
}