Multiplo Database db2 e sqlserver, query

di il
18 risposte

Multiplo Database db2 e sqlserver, query

Il database db2 si chiama panth01 il database sqlserver si chiama prova
Come puoi vedere nel codice, ho creato una singola query per estrarre la lingua in db2 e la lingua in sqlserver.

Il problema che in Db2 la colonna è chiamata LANGUAGE, invece in sqlserver la colonna è chiamata LINGUA

In db2 la colonna LINGUA ha due parole "en" quando vengano estratti i dati, in SqlServer la colonna LINGUA ha tre parole quando vengono estratti i dati "eng"

Ho fatto la query:

String query = "select PANTH01.THERA.CLASS_HDR.LANGUAGE, PROVA.DIZIOPT.LINGUA from PANTH01.THERA.CLASS_HDR JOIN PROVA.DIZIOPT.LINGUA ON PANTH01.THERA.CLASS_HDR.LANGUAGE = PROVA.DIZIOPT.LINGUA";
questo è il codice completo:

//DB2
private static final String DB_DRIVER_DB2 = "com.ibm.db2.jcc.DB2Driver";
private static final String DB_CONNECTION_DB2 = "jdbc:db2://10.12.230.83:50000/PANTH01";
private static final String DB_USER_DB2 = "finance";
private static final String DB_PASSWORD_DB2 = "finance";

//SQLSERVER
private static final String DB_DRIVER_SQLSERVER = "net.sourceforge.jtds.jdbc.Driver";
private static final String DB_CONNECTION_SQLSERVER = "jdbc:jtds:sqlserver://10.65.21.15:1433;DatabaseName=PROVA";
private static final String DB_USER_SQLSERVER = "sa";
private static final String DB_PASSWORD_SQLSERVER = "sa";

public void selectTHERACLASS_HDR_THERACLASS_HDR_NLS() throws Exception {

//DB2_inizio
Connection dbConnection = null;
Statement statement = null;
//DB2_fine

//SqlServer_inzio
Connection dbConnectionSqlServer = null;
Statement statementSqlServer = null;
//SqlServer_fine

//Query SqlServer and db2
String query = "select PANTH01.THERA.CLASS_HDR.LANGUAGE, PROVA.DIZIOPT.LINGUA from PANTH01.THERA.CLASS_HDR JOIN PROVA.DIZIOPT.LINGUA ON PANTH01.THERA.CLASS_HDR.LANGUAGE = PROVA.DIZIOPT.LINGUA";

try {
//DB2_inizio
dbConnection = getConnectionDb2();
statement = dbConnection.createStatement();
//DB2_fine

//sqlserver_inizio
dbConnectionSqlServer = getConnectionSqlServer();
statementSqlServer = dbConnectionSqlServer.createStatement();
ResultSet rSqlServer = statementSqlServer.executeQuery(query);
//sqlserver_inizio_fine

while (rSqlServer.next()) {


String language = rSqlServer.getString("LANGUAGE");
String lingua = rSqlServer.getString("LINGUA");

System.out.println("LANGUAGE: " + language);
System.out.println("LINGUA: " + lingua);
}

} catch (SQLException e) {

System.out.println(e.getMessage());

} finally {

if (statement != null && statementSqlServer != null) {
statement.close();
statementSqlServer.close();
}

if (dbConnection != null && dbConnectionSqlServer != null) {
dbConnection.close();
dbConnectionSqlServer.close();
}
}
}
output errore:

Invalid object name 'PANTH01.THERA.CLASS_HDR'

Perchè qui proviene l'errore --> statementSqlServer che comunico in sqlserver ma non i db è non riesco a fare la query

18 Risposte

  • Re: Multiplo Database db2 e sqlserver, query

    imparareJava ha scritto:


    Il problema che in Db2 la colonna è chiamata LANGUAGE, invece in sqlserver la colonna è chiamata LINGUA

    In db2 la colonna LINGUA ha due parole "en" quando vengano estratti i dati, in SqlServer la colonna LINGUA ha tre parole quando vengono estratti i dati "eng"
    [...]
    Perchè qui proviene l'errore --> statementSqlServer che comunico in sqlserver ma non i db è non riesco a fare la query
    Chiarisci meglio: innanzitutto perché hai 2 database (e di tecnologia differente, oltretutto)? Devono essere usati entrambi insieme nella applicazione? O solo uno per volta a seconda dell' "ambiente" di esecuzione?

    Quali sono esattamente i tuoi dubbi? Come far "convivere" queste due basi dati? Come poter fare una singola query che si "adatti" ad entrambi i db? Come poter "astrarre" le differenze tra le varie tabelle?
  • Re: Multiplo Database db2 e sqlserver, query

    Ho due database di tecnologia differente perchè nel primo database db2 tramite una tabella che ha la colonna lingua
    per estrarre tutti i valori della lingua
    In sqlserver ho un altra tabella della colonna lingua per estrarre i valori della lingua

    facendo la connessione in db2 e sqlserver

    vorrei estrarre i valori della lingua in db2 e i valori della lingua sqlserver

    Purtroppo devo utilizzare queste due tecnologie, coloro che hanno fatto questa cosa, devo per forza usare
    Devono essere utilizzati nella stessa applicazione

    Qui è il dubbio:
    output errore:
    Invalid object name 'PANTH01.THERA.CLASS_HDR'
    Perchè qui proviene l'errore --> statementSqlServer che comunico in sqlserver ma non i db è non riesco a fare la query
    capire come far unire due database differenti, per fare uscire una query
  • Re: Multiplo Database db2 e sqlserver, query

    1) il linguaggio SQL NON E' ESATTAMENTE lo stesso per tutti i DBMS. Si assomigliano al 75/80% in generale
    2) non ti conviene avere 2 databse distinti: introduci solo PROBLEMI (pochi/tanti, semplici/rognosi)
    3) per accedere ai 2 DBMS devi creare 2 connessioni/2 autenticazioni
    4) non puoi mescolare le tabelle di un DBMS con quelle dell'altro

    Quindi, se ti serve una tabella da un DBMS, tanto vale che la copi nell'altro.
  • Re: Multiplo Database db2 e sqlserver, query

    1) 2 connessioni e 2 autenticazioni già fatte come hai potuto vedere nel codice.
    2) Se i DBMS sono differenti.
    3) Come posso realizzare la query con due database differenti?
    4) La copia della Tabella in SqlServer come si fa?
    5) Come si effettua una query quando ho effettuato la copia della tabella?

    Fammi un esempio, anche banale.
  • Re: Multiplo Database db2 e sqlserver, query

    imparareJava ha scritto:


    non riesco a fare la query
    capire come far unire due database differenti, per fare uscire una query
    Quando tra 2 db così hai nomi di tabelle differenti e magari/soprattutto nomi di colonne differenti (e/o peggio ancora DATI di forma differente, es. "en" su uno e "eng" sull'altro), la cosa migliore è separare per bene le due cose (al costo di scrivere codice proprio separato) e cercare di "nascondere" il più possibile le differenze tra i due.

    Un esempio banale ma non troppo complesso:
    Sul DB2 hai una tabella USERS con le colonne ID, FIRST_NAME, LAST_NAME
    Sul SqlServer hai una tabella USER_ACCOUNTS con le colonne USER_ID, NAME, SURNAME

    Hanno tutto differente. Ma sono similari concettualmente. Quindi si può fare una classe "bean" User generalizzata con le proprietà id, firstName, lastName e poi fare 2 classi "DAO" del tipo UsersDb2Dao e UsersSqlServerDao (e magari per astrazione si fa una interfaccia UsersDao implementata da entrambe) che hanno entrambe un metodo es.:

    public List<User> getAllUsers()

    I dettagli sulle differenze tra le due tabelle (nomi, ecc..) sono nascosti all'interno di ciascun getAllUsers() e tu al livello di sopra (chi usa una o l'altra implementazione), non se ne accorge. Tutto qui, questo è quello che si fa tipicamente in casi così.
  • Re: Multiplo Database db2 e sqlserver, query

    Allora in pratica se ho capito bene:

    1) Creare una classe User, che ha le stesse caratteristiche delle colonne user del database db2
    2) Creo una classe UsersDb2Dao
    3) Creo una classe UsersSqlServerDao
    4) Interfaccia UsersDao che vengono implementati ad entrambi, qui ovviamente mi creo vari metodi

    Le connessioni db2 e sqlserver devo mettere entrambi in questo metodo?
    public List<User> getAllUsers() per estrapolare tutti i dati?
    quando faccio la ResultSet che devo mettere db2 o sqlserver?

    Qualche esempio banale gentilmente che mi trovo in difficolta?
    Quindi, se ti serve una tabella da un DBMS, tanto vale che la copi nell'altro.
    Con questo esempio come effettuo la copia? esempio?
  • Re: Multiplo Database db2 e sqlserver, query

    imparareJava ha scritto:


    Le connessioni db2 e sqlserver devo mettere entrambi in questo metodo?
    public List<User> getAllUsers() per estrapolare tutti i dati?
    quando faccio la ResultSet che devo mettere db2 o sqlserver?
    Usando ancora l'esempio fatto prima, in UsersDb2Dao il getAllUsers farà la select su USERS e estrarrà le colonne ID, FIRST_NAME, LAST_NAME.
    E in UsersSqlServerDao il getAllUsers() farà la select su USER_ACCOUNTS ecc..
    Insomma proprio codice separato, specializzato per ciascuna tabella specifica.

    Per la Connection, chiaramente saranno Connection distinte, ottenute a fronte di url ovviamente differenti. Su come gestire le connection ci possono essere design differenti, a seconda di come/dove vengono creati e forniti gli oggetti.

    Una possibilità è fare 2 classi separate, es. Db2Connection e SqlServerConnection. In ciascuna, uno static init block carica il driver (così è fatto una volta sola) e poi si mette un metodo es. getConnection().

    Altrimenti un altro design è fare una classe es. DatabaseConnection generica che riceve dall'esterno, nome classe del driver, url, username ecc... e poi crearne 2 istanze, una per ciascun db. Questa è una opzione valida se si fosse in un contesto dove c'è la DI (Dependency Injection) come con Spring Framework.
  • Re: Multiplo Database db2 e sqlserver, query

    Grazie. Quando ho risolto è funziona, pubblico il codice. Cosi in futuro se qualcuno ha un problema si legge questo post.
  • Re: Multiplo Database db2 e sqlserver, query

    Salve,

    Ho trovato un altro problema:

    Questo è il codice della classe DizioPt che rappresenta i valori della tabella:
    
    public class DizioPt {
    	
    	public int stato;
    	public String lingua;
    	public String keyword;
    	public String traduzione;
    	
    	public DizioPt(int stato, String lingua, String keyword, String traduzione) {
    		this.stato = stato;
    		this.lingua = lingua;
    		this.keyword = keyword;
    		this.traduzione = traduzione;
    	}
    	
    	public DizioPt() {}
    
    	public int getStato() {
    		return stato;
    	}
    
    	public void setStato(int stato) {
    		this.stato = stato;
    	}
    
    	public String getLingua() {
    		return lingua;
    	}
    
    	public void setLingua(String lingua) {
    		this.lingua = lingua;
    	}
    
    	public String getKeyword() {
    		return keyword;
    	}
    
    	public void setKeyword(String keyword) {
    		this.keyword = keyword;
    	}
    
    	public String getTraduzione() {
    		return traduzione;
    	}
    
    	public void setTraduzione(String traduzione) {
    		this.traduzione = traduzione;
    	}
    	
    
    
    }
    
    Questo è il codice della classe ClassHdrNls che rappresenta i valori della tabella:
    
    public class ClassHdrNls {
    	
    	public String className;
    	public String language;
    	public String nlsClassName;
    	public String nlsPlClassName;
    	
    	public ClassHdrNls(String className, String language, String nlsClassName, String nlsPlClassName) {
    		this.className = className;
    		this.language = language;
    		this.nlsClassName = nlsClassName;
    		this.nlsPlClassName = nlsPlClassName;
    	}
    	
    	public ClassHdrNls() {}
    
    	public String getClassName() {
    		return className;
    	}
    
    	public void setClassName(String className) {
    		this.className = className;
    	}
    
    	public String getLanguage() {
    		return language;
    	}
    
    	public void setLanguage(String language) {
    		this.language = language; //.substring(0,3); // taglio il carattere eng in en
    	}
    
    	public String getNlsClassName() {
    		return nlsClassName;
    	}
    
    	public void setNlsClassName(String nlsClassName) {
    		this.nlsClassName = nlsClassName;
    	}
    
    	public String getNlsPlClassName() {
    		return nlsPlClassName;
    	}
    
    	public void setNlsPlClassName(String nlsPlClassName) {
    		this.nlsPlClassName = nlsPlClassName;
    	}
    
    
    }
    
    Questa è la connessione sqlserver e db2:
    
    public class Database {
    	
    	private static final String DB_DRIVER_DB2 = "com.ibm.db2.jcc.DB2Driver";
    	private static final String DB_CONNECTION_DB2 = "jdbc:db2://60.80.290.89:58880/ppp";
    	private static final String DB_USER_DB2 = "finance";
    	private static final String DB_PASSWORD_DB2 = "finance";
    
    	private static final String DB_DRIVER_SQLSERVER = "net.sourceforge.jtds.jdbc.Driver";
    	private static final String DB_CONNECTION_SQLSERVER = "jdbc:jtds:sqlserver://90.99.99.44:1222;DatabaseName=PROVA";
    	private static final String DB_USER_SQLSERVER = "sa";
    	private static final String DB_PASSWORD_SQLSERVER = "sa";
    	
    	//DB2
    		public Connection getConnectionDb2() throws Exception {
    
    			try {
    				Class.forName(DB_DRIVER_DB2);
    				System.out.println("Connesso DB2");
    				return DriverManager.getConnection(DB_CONNECTION_DB2, DB_USER_DB2, DB_PASSWORD_DB2);
    			} catch (SQLException sqlex) {
    				System.out.println("NON Connesso");
    				sqlex.printStackTrace();
    			} catch (Exception ex) {
    				System.out.println("NON Connesso");
    				ex.printStackTrace();
    			}
    			return null;
    		}
    		
    		//SQLSERVER
    		public Connection getConnectionSqlServer() throws Exception {
    
    			try {
    				Class.forName(DB_DRIVER_SQLSERVER);
    				System.out.println("Connesso SQLSERVER");
    				return DriverManager.getConnection(DB_CONNECTION_SQLSERVER, DB_USER_SQLSERVER, DB_PASSWORD_SQLSERVER);
    			} catch (SQLException sqlex) {
    				System.out.println("NON Connesso");
    				sqlex.printStackTrace();
    			} catch (Exception ex) {
    				System.out.println("NON Connesso");
    				ex.printStackTrace();
    			}
    			return null;
    		}
    
    }
    
    Questo è il traduttore:
    
    public class Traduttore {
    	List<DizioPt> listDizio = new ArrayList<DizioPt>();
    	
    	// Lista Popolata DizioPt SQLSERVER
    	public List<DizioPt> getListDizioPt() throws Exception {
    		
    		Database database = new Database();
    		Connection dbConnectionSqlServer = null;
    		Statement statementSqlServer = null;
    
    		String queryDizio = "select * from DIZIOPT";
    
    		try {
    
    			dbConnectionSqlServer = database.getConnectionSqlServer();
    			statementSqlServer = dbConnectionSqlServer.createStatement();
    			ResultSet rs = statementSqlServer.executeQuery(queryDizio);
    
    			while (rs.next()) {
    				DizioPt diziopt = new DizioPt();
    
    				diziopt.stato = rs.getInt("STATO");
    				diziopt.lingua = rs.getString("LINGUA");
    				diziopt.keyword = rs.getString("KEYWORD");
    				diziopt.traduzione = rs.getString("TRADUZIONE");
    				listDizio.add(diziopt);
    
    				System.out.println("---------------------------------------------");
    				System.out.println("***SQLSERVER***");
    				System.out.println("stato: " + diziopt.getStato());
    				System.out.println("lingua: " + diziopt.getLingua());
    				System.out.println("keyword: " + diziopt.getKeyword());
    				System.out.println("traduzione: " + diziopt.getTraduzione());
    				System.out.println("---------------------------------------------");
    
    			}
    
    		} catch (SQLException e) {
    
    			System.out.println(e.getMessage());
    
    		} finally {
    
    			if (statementSqlServer != null) {
    				statementSqlServer.close();
    			}
    
    			if (dbConnectionSqlServer != null) {
    				dbConnectionSqlServer.close();
    			}
    
    		}
    		return listDizio;
    	}
    
    	// Lista Db2
    	public List<ClassHdrNls> getListClassHdrNls() throws Exception {
    		List<ClassHdrNls> listClassHdrNls = new ArrayList<ClassHdrNls>();
    		Database database = new Database();
    		Connection dbConnectionDb2 = null;
    		Statement statementDb2 = null;
    
    		String queryDb2 = "select * from THERA.CLASS_HDR_NLS";
    
    		try {
    			dbConnectionDb2 = database.getConnectionDb2();
    			statementDb2 = dbConnectionDb2.createStatement();
    
    			ResultSet rs = statementDb2.executeQuery(queryDb2);
    
    			while (rs.next()) {
    				ClassHdrNls classHdrNls = new ClassHdrNls();
    				classHdrNls.className = rs.getString("CLASS_NAME");
    				classHdrNls.language = rs.getString("LANGUAGE");
    				classHdrNls.nlsClassName = rs.getString("NLS_CLASS_NAME");
    				classHdrNls.nlsPlClassName = rs.getString("NLS_PL_CLASS_NAME");
    				listClassHdrNls.add(classHdrNls);
    
    				System.out.println("---------------------------------------------");
    				System.out.println("***THERA.CLASS_HDR_NLS***");
    				System.out.println("CLASS_NAME: " + classHdrNls.getClassName());
    				System.out.println("LANGUAGE: " + classHdrNls.getLanguage());
    				System.out.println("NLS_CLASS_NAME: " + classHdrNls.getNlsClassName());
    				System.out.println("NLS_PL_CLASS_NAME: " + classHdrNls.getNlsPlClassName());
    				System.out.println("---------------------------------------------");
    
    			}
    
    		} catch (SQLException e) {
    
    			System.out.println(e.getMessage());
    
    		} finally {
    
    			if (statementDb2 != null) {
    				statementDb2.close();
    			}
    
    			if (dbConnectionDb2 != null) {
    				dbConnectionDb2.close();
    			}
    
    		}
    		return listClassHdrNls;
    	}
    
    	//Lingua --> Traduction
    	public List<DizioPt> getTraductionD2b_SqlServer() {
    	
    		for (int i = 0; i < listDizio.size(); i++) {
    			System.out.println(listDizio.get(i).getStato());
    
    		}
    		return listDizio;
    		
    
    	}
    
    }
    
    Poi il main per eseguire il metodo?
    Traduttore traduttore = new Traduttore();
    traduttore.getTraductionD2b_SqlServer();

    NON MI RESTITUISCE NULLA, COME MAI?
    Mi potete aiutare, visto che la lista è popolata?
  • Re: Multiplo Database db2 e sqlserver, query

    imparareJava ha scritto:


    Poi il main per eseguire il metodo?
    Traduttore traduttore = new Traduttore();
    traduttore.getTraductionD2b_SqlServer();

    NON MI RESTITUISCE NULLA, COME MAI?
    No, alt. Il getTraductionD2b_SqlServer() utilizza il listDizio che è la variabile di istanza definita all'inizio. E quella lista è anche usata dal getListDizioPt(). Non va bene, NON devi tenere una lista come variabile di istanza. Ciascun metodo deve crearsi la sua nuova lista e popolarla.
    Mentre invece getListClassHdrNls() crea una sua nuova lista (e questo è sensato).


    P.S. Le due classi DizioPt e ClassHdrNls sono "quasi" giuste. Hai messo i campi come public:

    public int stato;
    public String lingua;
    public String keyword;
    public String traduzione;

    Abituati a tenere i campi di istanza come private. Per "buona programmazione".
  • Re: Multiplo Database db2 e sqlserver, query

    Visto che ho messo private i campi
    private String className;
    private String language;
    private String nlsClassName;
    private String nlsPlClassName;
    in resulset come faccio a chiamare className?

    while (rs.next()) {
    ClassHdrNls classHdrNls = new ClassHdrNls();

    classHdrNls.className = rs.getString("CLASS_NAME");

    Qui mi segna l'errore classHdrNls.className ?

    L'ho risolto in questo modo:
    while (rs.next()) {
    ClassHdrNls classHdrNls = new ClassHdrNls();

    String className = rs.getString("CLASS_NAME");
    classHdrNls.setClassName(className);

    Inoltre come hai detto tu:
    Se io creo un metodo è devo utilizzare tutti è due le liste che appartengono a database differenti.Devo creare sempre una query per popolare?
    Poi devo creare in questo modo:
    public List<Object> getDb2Sqlserver(){
    Qui chiamo le due liste? che non sono globali oppure?
    }
  • Re: Multiplo Database db2 e sqlserver, query

    imparareJava ha scritto:


    Visto che ho messo private i campi
    in resulset come faccio a chiamare className?
    O usi il costruttore (se lo definisci per ricevere tutti i dati) o usi i metodi "setter" (preferibile se ci fossero molti dati).

    imparareJava ha scritto:


    Qui mi segna l'errore classHdrNls.className ?
    Devi usare i metodi getter/setter per accedere ai campi! E' così che si fa.
    Queste sono BASI della programmazione ad oggetti in generale.

    imparareJava ha scritto:


    Se io creo un metodo è devo utilizzare tutti è due le liste.Devo creare sempre una query per popolare?
    La tua frase non è molto chiara ...
    Se un metodo di query restituisce un List<Qualcosa>, l'oggetto concreto della lista (es. ArrayList) lo DEVI creare lì nel metodo per poi restituirlo alla fine. Non devi usare liste "condivise" o che altro.
  • Re: Multiplo Database db2 e sqlserver, query

    Riformulo la domanda.

    Visto che le Liste non sono GLOBALI.

    Essendo che devo creare un altro metodo
    E' devo creare due Liste sia della prima tabella e sia della seconda tabella.
    E' devo mettere a confronto la colonna lingua della prima tabella e della seconda tabella della colonna lingua che sia chiama in un altro modo.
    E' devo fare sempre la query sia per uno e per l'altro?
    Il metodo mi deve restituire una lista Generics o Objects cioè deve contenere le due classi

    Esempio:
    
    public void traduzione() {
    		List<DizioPt> listDizio = new ArrayList<DizioPt>();
    		List<ClassHdrNls> listHdr = new ArrayList<ClassHdrNls>();
    		
    		
    		
    	}
    
    In questo metodo mi deve restituire una lista, ma di che tipo?
    Ovviamente devo fare le query e devo manipolare tramite tramite la lista
  • Re: Multiplo Database db2 e sqlserver, query

    imparareJava ha scritto:


    
    public void traduzione() {
    		List<DizioPt> listDizio = new ArrayList<DizioPt>();
    		List<ClassHdrNls> listHdr = new ArrayList<ClassHdrNls>();
    
    In questo metodo mi deve restituire una lista, ma di che tipo?
    Ovviamente devo fare le query e devo manipolare tramite tramite la lista
    Puoi spiegare a parole cosa dovrebbe concettualmente fare traduzione() con le due liste?
Devi accedere o registrarti per scrivere nel forum
18 risposte