Newsgroup: it.comp.java
Titolo: Driver jdbc per Microsoft SQL Server 2000 e SELECT DISTINCT

Salve,
ho incontrato un problema impiegando i driver JDBC di SQL server 2000:
eseguendo una banale query di selezione con rimozione di righe
duplicate, ovvero  "select distinct ... ", con jdbc ottengo un
ResultSet contenente tutte le righe, come se la clausola DISTINCT non
fosse intervenuta.
Con una ricerca sul web ho visto che questo non è un problema nuovo,
ma non ho ben capito il tipo di soluzione da adottare (anche perchè
alcuni post soni in lingue che non comprendo).
Qualcuno potrebbe dirmi cortesemente come ovviare al problema?
Distinti Saluti.
Simplex2
www.mdenittis.it

>ho incontrato un problema impiegando i driver JDBC di SQL server 2000:
Scusa manca un'informazione importante: quale driver JDBC di SQL Server
2000 ?
Ne esistono molti: quello standard Microsoft, jTDS (open source), altri
commerciali...
A questo aggiungo una considerazione generale: i driver JDBC non fanno
altro che prendere la query SQL (quasi sempre senza nemmeno farne il
parsing) e passarla al database manager che esegue l'istruzione e
restituisce i risultati al driver jdbc. Quindi il primo problema che ti
dovresti porre è: eseguendo la stessa query tramite il 'Query
Analyzer' che risultati ottieni ?

 Analyzer' che risultati ottieni ?
Quelli corretti !!!!
(Altrimenti non avrei incontrato il problema, giusto?).
Ciao.
Simplex2
www.mdenittis.it

>Quello standard Microsoft.
Non mi sono mai imbattuto in questo problema utilizzando il driver
Microsoft... pur avendo incontrato decine di altri problemi soprattutto
legati alle performance... :)
Quindi il primo consiglio che posso darti è di provare ad utilizzare
un altro driver. Per cominciare ti consiglio jTDS:
http://jtds.sourceforge.net/

 fosse intervenuta.
Dovresti IMHO indagare con SQLProfiler che istruzione SQL arriva al
database, se è vero che si perde per strada la distinct. Se è così,
mi pare evidente che si tratta di un bug del driver JDBC che usi. Penso
che troverai dei workaround.

 Quello standard Microsoft.
Ti ricordo che sono stati rilasciati 3 service pack:
http://www.microsoft.com/downloads/details.aspx?familyid=07287B11-0502-461A-B138-2AA54BFDC03A&displaylang=en
e ti informo che c'e' un nuovo driver per sql server 2000
http://www.microsoft.com/downloads/details.aspx?familyid=07287B11-0502-461A-B138-2AA54BFDC03A&displaylang=en
Potresti specificare che versione stai usando ?
--
Marco
*** Free account sponsored by SecureIX.com ***
*** Encrypt your Internet usage with a free VPN account from 
http://www.SecureIX.com
 ***

Certamente.
Sto usando il Service Pack 3 - versione 2.2.0040 del maggio 2004.
I due link che hai fornito  portano entrambi alla stessa pagina che è
quella da cui ho scaricato i driver.
L'RDBMS che sto usando è l'MSDE 2000 e il JDK è il 5.0.
Grazie del tuo interessamento.
Simplex2
www.ndenittis.it

quella da cui ho scaricato i driver.
Cut&paste andato male:
http://www.microsoft.com/downloads/details.aspx?familyid=e22bc83b-32ff-4474-a44a-22b6ae2c4e17&displaylang=en
anche con questo non ho il problema:
__________________
driver:Microsoft SQL Server 2005 JDBC Driver
version:1.0.809.102
major:1
minor:0
tutto a posto
__________________
Tutto gira su sql server 2000 e jdk 1.5


Ciao a tutti.
La query che lancio da una pagina JSP è la seguente:
.... CUT ....
MySql= new String("SELECT DISTINCT ANNO FROM SCHEDA_ARCHIVIO_NEW ORDER
BY ANNO");
try{
	MyConn = connessione.apriConnesionejdbc();
	MyCommand = MyConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
	ResSet = MyCommand.executeQuery(MySql);
...... CUT .....
Con un Packet sniffer vado a vedere cosa invia il driver JDBC a MS SQL
Server 2000 e, in un pacchetto, trovo il seguente payload:
<payload>
e  j S 8P Bg s          S E L E C T   D I S T I N C T   A N N O   ,   *
    F R O M   S C H E D A _ A R C H I V I O _ N E W   O R D E R   B Y
A N N O
</payload>
Adesso la domanda, che magari avrà anche una risposta scontata, è:
<< Per quale motivo il driver JDBC trasforma la mia query? >>
Qualche idea?
Grazie a tutti.
Simplex2
www.mdenittis.it

<< Per quale motivo il driver JDBC trasforma la mia query? >>
Penso che solo l'assistenza tecnica Microsoft possa aiutarti
sullo spiegarti i motivi del comportamento.
Il vecchio driver miscrosoft ha parecchie stranezze, dovuto al fatto
di essere basato su un driver di terze parti 'antico'.
Ho replicato il problema modificando il mio esempio
    stat=c.createStatement();
in
    stat=c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
Ti sarai accorto che con il nuovo driver il problema non sussiste,
altro motivo per passare a questo dal mio punto di vista.
--
Marco
*** Posted via a free Usenet account from 
http://www.teranews.com
 ***

RISOLTO IL MISTERO.
Dunque, l'errore (se di errore può parlarsi) è dovuto essenzialmente
al tipo di ResultSet che viene istanziato con il metodo
createStatement() della classe Connection.
Infatti la mia invocazione istanziava un ResultSet 'scollabile' (lo so,
il termine è bruttissimo e fa venire in mente qualcos'altro ... ;-))
aggiornabile in modo concorrente.
Questo si traduce nel fatto che, attraverso il ResultSet, deve essere
possibile aggiornare i campi del singolo record selezionato cosa che,
ovviamente, con la mia query non si può più fare per la resenza della
clausola DISTINCT.
A questo punto inteviene il driver JDBC che modifica la query in modo
da ottenere effettivamente un ResultSet aggiornabile!
Nell'esempio di Marco Trevisan, infatti, il ResultSet creato è di tipo
TYPE_FORWARD_ONLY e CONCUR_READ_ONLY e il problema non si presenta!
Ho provato, quindi, a modificare la mia pagina JSP e a sniffare la
chiamata JDBC al server. Guardate un po' il payload del pacchetto:
<payload>
2  -  ~]   P Bg       ~    S E L E C T   D I S T I N C T   A N N O   F
R O M   S C H E D A _ A R C H I V I O _ N E W   O R D E R   B Y   A N N
O
</payload>
Che ve ne pare?
Ho detto una cazzata?
P.S.
Marco, per favore, se hai tempo puoi provare a vedere se riesci a
riprodurre l'errore creando un ResultSet di tipo
CONCUR_UPDATABLE?
Grazie.
Simplex2
www.mdenittis.it