|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2006
Messaggi: 176
|
[JAVA] connessione a sql server 2000
Ciao a tutti, sto cercando di connettermi a sql server 2000 con questo codice
Codice:
public class Conn { /** * @param args */ public static void main(String args[]) { try { String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); System.out.println("JDBC driver loaded ok."); String url = "jdbc:microsoft:sqlserver://indirizzo;nomeDB"; Connection con = DriverManager.getConnection(url, "user", "pass"); Statement cmd = con.createStatement(); String query = "SELECT * FROM nomeTabella"; ResultSet res = cmd.executeQuery(query); while (res.next()) { System.out.println(res.getString("nomeColonna1")); System.out.println(res.getString("nomeColonna2")); } res.close(); cmd.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } JDBC driver loaded ok. java.sql.SQLException: No suitable driver found for jdbc:microsoft:sqlserver://indirizzo;nomeDB at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at Conn.main(Conn.java:16) come mai? |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Apr 2006
Messaggi: 5857
|
Non hai il driver JDBC nel tuo classpath.
Devi scaricarlo (ms jdbc 3.0 dal sito microsoft) e porre il file sqljdbc4.jar nel classpath della tua applicazione. Inoltre elimina o commenta la tua riga di codice String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; perché è sbagliata e cmq non la stai usando. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Oct 2006
Messaggi: 176
|
Ciao! ho risolto così:
Codice:
public class Conn { /** * @param args */ public static void main(String args[]) { try { String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; Class.forName(driver); System.out.println("JDBC driver loaded ok."); String url = "jdbc:sqlserver://indirizzo:porta;databaseName = nomeDB"; Connection con = DriverManager.getConnection(url, "user", "pass"); Statement cmd = con.createStatement(); String query = "SELECT * FROM nomeTabella"; ResultSet res = cmd.executeQuery(query); while (res.next()) { System.out.println(res.getString("nomeColonna1")); System.out.println(res.getString("nomeColonna2")); } res.close(); cmd.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } Come hai visto quella classe contiene un Main, ma se volessi creare una classe (senza main) con un metodo che mi ritorni un oggetto di tipo ResultSet contenente il risultato di una query come posso fare? Grazie!!! ![]() Ultima modifica di superciccio14 : 07-03-2011 alle 19:05. |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Oct 2006
Messaggi: 176
|
Mi spiego meglio
Codice:
public class Conn { /** * @param args */ public ResultSet connettiti { try { String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; Class.forName(driver); System.out.println("JDBC driver loaded ok."); String url = "jdbc:sqlserver://indirizzo:porta;databaseName = nomeDB"; Connection con = DriverManager.getConnection(url, "user", "pass"); Statement cmd = con.createStatement(); String query = "SELECT * FROM nomeTabella"; ResultSet res = cmd.executeQuery(query); while (res.next()) { System.out.println(res.getString("nomeColonna1")); System.out.println(res.getString("nomeColonna2")); } return res; //res.close(); //cmd.close(); //con.close(); } catch (SQLException e) { e.printStackTrace(); return null; } catch (ClassNotFoundException e) { e.printStackTrace(); return null; } } } Dove sbaglio? |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Premetto che ci sono delle API, tipo JPA, che ti liberano dall'onere di gestire questi dettagli, comunque è un problema di ambiti: chiaramente devi chiudere lo statement (il result set lo segue a ruota) dopo aver restituito il resultset, quindi devi spostarlo da un ambito locale ad uno inter-metodo. Avrai quindi una cosa di questo genere:
Codice:
class Conn { private Connection con; private Statement cmd; public ResultSet open() throws SQLException { try { con = ...apri la connessione cmd = con.createStatement ...return il result set senza chiudere niente } public void close() throws SQLException { try { cmd.close(); } finally { con.close(); } } } Codice:
Conn pippo = new Conn(); try { ResultSet res = pippo.open(); } catch(SQLException ex) { log...ex } finally { try { pippo.close(); } catch(SQLException ex) { log ex } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Oct 2006
Messaggi: 176
|
Ciao, JPA dici? Ma è complicata da usare?
Allora io ho modificato la classe così Codice:
import java.sql.*; public class FetchData { private Connection con; private Statement cmd; /** * @param args */ // proprità public String query; } // apri connessione public ResultSet open(String q) throws SQLException, ClassNotFoundException { // prepara connessione String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; Class.forName(driver); // verifica caricamento driver System.out.println("[Debug] - JDBC driver loaded ok."); // url connessione String url = "jdbc:sqlserver://indirizzo:porta;databaseName = nomeDB""; // connessione Connection con = DriverManager.getConnection(url, "user", "pass"); Statement cmd = con.createStatement(); ResultSet res = cmd.executeQuery(q); return res; } public void close() throws SQLException { try { cmd.close(); } finally { con.close(); } } } import java.sql.*; Codice:
public class Gestione { /** * @param args * @throws SQLException */ public static void main(String[] args) { // TODO Auto-generated method stub String qy = "SELECT * from tabella"; FetchData pippo = new FetchData(); try { ResultSet res = pippo.open(qy); // conto colonne ResultSet ResultSetMetaData rsmd = res.getMetaData(); System.out.println(rsmd.getColumnCount()); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { pippo.close(); } catch (SQLException e) { e.printStackTrace(); } } } } Eppure ho come errore Exception in thread "main" Java.lang.NullPointerException...mi sfugge qualcosa ![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
In FetchData dichiari due campi, con e cmd, ma non assegni loro alcun valore.
Quando invochi close, usi quei due campi che sono "null", da cui la null pointer exception. Nel metodo open crei due variabili locali che hanno lo stesso nome (con e cmd) ma sono due cose diverse (esistono in ambiti diversi). Assegna ai campi con e cmd i valori delle variabili locali con e cmd: ...open(String c) ... ... this.con = con; this.cmd = cdm; return res Oppure ometti la dichiarazione delle variabili locali con e cmd nel metodo open: //connessione con = DriverManager.getConnection(url, "user", "pass"); cmd = con.createStatement(); Non trovando il tipo davanti al nome, il compilatore assegnerà i valori alle due cose che si chiamano "con" e "cmd" che sono in ambito, cioè i campi. Nota che il codice che hai scritto è soggetto ad SQL injection. Circa JPA, non è possibile dire se sia complicato o no, dipende dall'esperienza personale. C'è sicuramente meno da scrivere. Devi includere un'implementazione della api (ad esempio EclipseLink, TopLink o Hibernate), scrivi un descrittore xml che ha la forma: Codice:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="NOME UNITA PERSISTENZA" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <properties> <property name="javax.persistence.jdbc.url" value="URL DI CONNESSIONE"> <property name="javax.persistence.jdbc.password" value="rinoceratopo1976"/> <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/> <property name="javax.persistence.jdbc.user" value="postgres"/> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence> La usi non diversamente da come faresti con driver, connessioni e compagnia bella: Dichiari un singleton: Codice:
package test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class PersistenceLayer { //testPU è il nome dell'unità dichiarato nel descrittore xml private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPU"); private static final EntityManager em = emf.createEntityManager(); public static EntityManager getEntityManager() { return em; } public static void dispose() { try { em.close(); } finally { emf.close(); } } } Codice:
package test; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class TestEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String nome; private String cognome; /** * Instance initializer */ public TestEntity() { } public String getCognome() { return cognome; } public void setCognome(String cognome) { this.cognome = cognome; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof TestEntity)) { return false; } TestEntity other = (TestEntity) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; } @Override public String toString() { return "test.TestEntity[id=" + id + "]"; } } TestEntity x = new TestEntity(); x.setNome("pippo"); x.setCognome("rossi"); PersistenceLayer.getEntityManager().persist(x); E morta lì. Se usi Netbeans è tutto guidato (e immagino che lo stesso sia per Eclipse).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Oct 2006
Messaggi: 176
|
Ciao, ho provato a mettere
this.con = con; this.cmd = cdm; nel metodo Open ma non funziona. L'errore sembra che sia nel metodo close() dopo il finally. PS. non dovrei anche chiudere il ResultSet? ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
il result set è chiuso automaticamente quando è chiuso il suo statement. Tieni conto che in un contesto reale non apri una connessione per ogni query quindi hai "due livelli" di cose da chiudere ma non complichiamoci la vita.
Se l'eccezione è una NullPointerException e hai messo this.con = con; this.cmd = cdm; nel metodo Open allora li hai messi prima dell'instanziazione delle corrispondenti variabili locali (e quindi assegni i campi a loro stessi). Per dire di più mi serve il codice del programma e la traccia completa dell'eccezione.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! Ultima modifica di PGI-Bis : 08-03-2011 alle 14:12. |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Oct 2006
Messaggi: 176
|
Ok, è esatto! Le avevo inserite male io
![]() perfetto! Proseguo col lavoro (ovvero creare un XML dal resultset, mi studio un po' JDOM e provo) Grazie ancora per l'aiuto!!! ![]() ![]() ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:20.