Newsgroup: it.comp.lang.visual-basic
Titolo: Query Anaiyzer, codice SQL in app, stessa query, risultati diversi

Salve,
Ho questa query :
Select Nome,Password from Utenti where ( Nome = 'user' ) and ( Password =
'pwd' ).
In QueryAnalyzer no problem. Perfetta.
Nel codice della mia app, LA STESSA QUERY dà risultati diversi.
Che fare?
Ciao
Andrea

 Nel codice della mia app, LA STESSA QUERY dà risultati diversi.
Potresti avere una diversa collation legata all'utente con cui ti connetti
da Query Analyzer o da Applicazione.
Guarda se i 'risultati diversi' sono ad esempio legati al case, o al trim
del campo.
Più complesso da individuare, ma possibile, è il caso delle code-page
diverse.
Proprio per questo, io uso sempre ltrim(rtrim(upper(campo))).
E' più brigoso, ma evito (quasi) ogni problema legato alla collation.
Ciao
Alberto

 Alberto
Ciao
Andrea

 Alberto
Ciao
Andrea

  :-P
Risolto con UCase :-P
Ciao
Andrea

 Proverò.
Aiuta.
Ciao
Alberto

 Risolto con UCase :-P
Ucase in T-SQL??
Sono sicurissimo che nelle query T-Sql ci voglia Upper.
Verifica.
Alberto

Riassunto.
Il fatto del trim non produce effetti positivi.
Devo verificare 'sta collation per vedere inannzitutto che è e
poi se mi può servire e se e come impostarla.
a dopo.
Ciao
Andrea

 Alberto
Andrea

 Mi fai un esempio plz?
Esempietto:
Query 1
Select * from tabella where campo='Ciao'
Query 2
Select * from tabella where
ltrim(rtrim(upper(campo)))=ltrim(rtrim(upper('Ciao')))
Queste due query (ammesso che siano compatibili con la tua logica
applicativa), potrebbero ritornare gli stessi risultati, se nel caso 1 è
applicata una collation di un certo tipo.
Cambiando la collation, Query_1 torna risultati diversi, mentre Query_2
continua a restituire gli stessi risultati di prima.
Questo finchè le variazioni alla collation non coinvolgono le code-page, nel
qual caso occorre necessariamente usare altre sintassi T-Sql.
In sostanza, usando ltrim(rtrim(upper, si perde di performance, ma si rende
il proprio codice molto più robusto rispetto a variazioni che, essendo
gestibili anche nella definizione del singolo login di Sql-Server,
potrebbero essere introdotte dal sa anche successivamente all'installazione.
E andare a capire dov'è il problema, dopo che l'applicativo è andato bene
per sei mesi, è una cosa incredibile.
Ma prima di rovinarti la giornata, cerca di capire quali differenze ci sono
fra i risultati delle due query (in Q.A. e in VB), per indirizzare il debug
in modo mirato.
Ciao
Alberto

 Alberto
Ciao
Andrea


Prova a postare il codice VB con cui generi la Source del recordset.
Poi vediamo.
Ciao
Alberto

L'AdoConnection è in un modulo di codice come
oggetto globale e lo inizializzo ed apro qui:
Private Sub Form_Load()
  AdoConnection.ConnectionString = "Provider=SQLOLEDB.1;Integrated
Security=SSPI;Persist Security Info=False;Initial Catalog=LAVITA_SVI;Data
Source=Server1"
  AdoConnection.Open
End Sub
Questo è l'evento Load della main.
Andrea

 Alberto
Ciao
Andrea

  AdoResSet.Open Qry.QueryText, AdoConn
?
La Source č Qry.QueryText, ma non vedo come la generi...
Alberto


Anche col Query Analyzer utilizzi l'integrated security, o usi un utente
specifico?
Alberto

 Alberto
Ciao
Andrea

     If AdoResSet.RecordCount > 0 Then
Altro dubbio...
Quando dici che il recordset č vuoto, intendi che testi EOF e BOF, o lo
verifichi solamente con il recordcount?
Alberto

     MsgBox Qry.QueryText
Quando arrivi qui, metti un breakpoint, vai in finestra immediata e fai ?
qry.querytext.
Copi il testo e lo metti in Q.A..
Poi mi dici, perchč vedo tante parentesi chiuse, apicini, UCase, infilati in
mezzo alla query, di cui sinceramente non capisco il significato.
Secondo me, cosě com'č, la query non funziona.
Ciao
Alberti

 Alberto
Andrea

 Alberti
Ciao
Andrea

In ogni caso non va :-(
Andrea

 Solo col RecordCount.
E già questo è un errore.
Anzichè testare Recordcount>0, usa
If not(rs.bof and rs.eof) then
Per quanto riguarda la query, così può andare, ma solamente se
ltrim(rtrim(upper li metti sia a sinistra che a destra dell'uguale.
CurQuery.QueryText = "Select Nome,Password From Utenti where ( LTrim(
RTrim( Upper(Nome))) =LTrim( RTrim( Upper( '#Param1' ) ) ) ) and ( LTrim(
RTrim( Upper(Password))) = LTrim(RTrim(Upper( '#Param2' ) ) ) )"
Ciao
Alberto

Grazie Albč, ora va... ho il sospetto che il vero problema fosse il
recordcount.
Andrea

 recordcount.
Ho anch'io quel sospetto.
In futuro, stai attento a non ripetere l'errore di cercare la soluzione ad
un problema, senza sapere se è veramente quello il problema.
Anche perchè il fatto che una stessa query desse risultati diversi poteva
farci addentrare nei meandri di sql-server, con grosso sconfusionamento
generale.
Mentre il problema era, probabilmente, in una cosa molto più banale e molto
nota.
Alberto