查詢不同sqlserver資料庫兩張表並比對欄位結構是否相同
阿新 • • 發佈:2019-02-09
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","恭喜你,這兩張表字段名-欄位型別及欄位長度相等!");
}
}
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("關閉連線失敗!");
}
}
}