Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ricerca di un campo presente nel profile di un utente

1 view
Skip to first unread message

Valeria

unread,
Jun 22, 2007, 8:49:28 AM6/22/07
to
Ciao a tutti, in una query devo eseguire una ricerca per un campo non
presente nella tabella aspnet_user ma creato come profile... come posso
recupeare tale campo?

Grazie

Matteo Migliore

unread,
Jun 22, 2007, 8:56:39 AM6/22/07
to
> Ciao a tutti, in una query devo eseguire una ricerca per un campo non
> presente nella tabella aspnet_user ma creato come profile... come posso
> recupeare tale campo?

Se usi le Membership API dovresti non considerare nemmeno
di avere un database :-).

Hai creato le proprietà del profile nel web.config
o definito una classe che eredita da ProfileBase?

Se sì:
----------------------------------
string PropertyValue = Profile.PROPERTY_NAME;
-----------------

Per maggiori informationi:
http://dotnetjunkies.com/QuickStartv20/aspnet/doc/profile/default.aspx#inherit

> Grazie

Prego! ;-)
Matteo Migliore.

Valeria

unread,
Jun 22, 2007, 11:26:47 AM6/22/07
to
> Se usi le Membership API dovresti non considerare nemmeno
> di avere un database :-).
>
> Hai creato le proprietà del profile nel web.config
> o definito una classe che eredita da ProfileBase?

ho creato nel mio bel web.config i campi del profile

ma il problema è questo:

se uno dei campi è (faccio un esempio), comune di residenza

e, in una stored procedure, devo gestire una select sul comune di
residenza per recuperare tutti gli utenti che hanno una specifica
residenza?? non essendo un campo presente nella tabella user non so come
gestire questa condizione nella stored procedure.


thanks

Matteo Migliore

unread,
Jun 22, 2007, 11:56:51 AM6/22/07
to
> se uno dei campi è (faccio un esempio), comune di residenza
>
> e, in una stored procedure, devo gestire una select sul comune di
> residenza per recuperare tutti gli utenti che hanno una specifica
> residenza?? non essendo un campo presente nella tabella user non so come
> gestire questa condizione nella stored procedure.

Usi comunque le Profile API, interrogare il DB con una store procedure
è più complesso e ti leghi al provider SQL.

Quarda qui:
http://tinyurl.com/2mdbbf

> thanks

Prego! ;-)
Matteo Migliore.

Valeria

unread,
Jun 25, 2007, 6:52:25 PM6/25/07
to
Scusa ma non mi è molto chiaro come gestire il mio problema :-(

devo gestire (in una stored procedure) una query che ricerca dei valori
di una specifica condizione WHERE (tramite una query) e tra queste ho
anche un valore contenuto nel profile dell'utente... quindi: dovendo
gestire per forza le condizioni in una stored procedure, come posso
aggiungere una condizione sui valori del profile?

Grazie

Matteo Migliore

unread,
Jun 25, 2007, 7:05:01 PM6/25/07
to
> devo gestire (in una stored procedure) una query che ricerca dei valori di
> una specifica condizione WHERE (tramite una query) e tra queste ho anche
> un valore contenuto nel profile dell'utente... quindi: dovendo gestire per
> forza le condizioni in una stored procedure, come posso aggiungere una
> condizione sui valori del profile?

La soluzione è semplice: non usi una sola store procedure :-).

Piuttosto scrivi una metodo che lavora con i dati ottenuti
dalla store procedure "più semplice" e che poi filtri, da codice, non da DB,
i dati che ti servono, recuperando i valori del profilo a runtime.

Le proprietà dei profili sono memorizzate,
per il momento, serializzandole con un formato del tutto
arbitrario su DB, quindi, e meno che tu non ti voglia scrivere
una SP che esegue il parsing dei campi, fallo da codice
che è molto più semplice.
E se poi dovessero cambiare il modo in cui i dati vengono
persistiti dal provider del Profile, o ne volessi scrivere uno
tu, il tuo codice rimarrebbe invariato.

Visto che sei all'inizio, se la risposta non ti fosse chiara,
chiedi ancora e ancora :-).

Valeria

unread,
Jun 26, 2007, 4:13:15 AM6/26/07
to

> Piuttosto scrivi una metodo che lavora con i dati ottenuti
> dalla store procedure "più semplice" e che poi filtri, da codice, non da
> DB,
> i dati che ti servono, recuperando i valori del profilo a runtime.


Grazie per le risposte e l'aiuto! Effettivamente a livello pratico non
mi è molto chiaro quello che devo fare per risolvere il problema,
potresti farmi un esempio pratico di come potrei gestire una query con:

campi del DB
campi del profile

a livello di codice e come poi "passarla" al DB?

Grazie infinite!

Valeria

unread,
Jun 26, 2007, 8:29:37 AM6/26/07
to


Please help me!! :-((

Ho cercato su google ma non ho trovato nulla su come risolvere il mio
problema.

Grazie ancora per l'aiuto!

Valeria

unread,
Jun 26, 2007, 1:03:58 PM6/26/07
to
E' da questa mattina che faccio prove ma non capisco proprio come fare
:-((((

Andrea Boschin [XeDotNet]

unread,
Jun 27, 2007, 5:00:54 AM6/27/07
to
Valeria wrote:
> E' da questa mattina che faccio prove ma non capisco proprio come fare
> :-((((

Ciao,

La prsistenza dei dati del profilo è piuttosto complessa e non è facile
scrivere delle procedure che riescano ad accedere ad essi. Se devi fare
delle query di selezione hai due modi:

1) ti carichi i profili degli utenti e fai tu la selezione via codice,
ma la cosa può essere un po' impegnativa ma credo si possa fare usando
in modo furbo FindProfilesByUserName
http://msdn2.microsoft.com/en-us/library/system.web.profile.profileprovider.findprofilesbyusername.aspx

2) sposti le informazioni di profilo su cui devi fare ricerche su una
tabella custom, relazionata a quella dell'utente. Lascia questa
soluzione come ultima razio se con la prima opzione non ne vieni a capo.
Magari in quel caso scrivi nuovamente che parliamo su come trovare una
soluzione migliore e trasparente.

Ciao!

--
--

Andrea Boschin
Member of: http://www.xedotnet.org
Blog: http://blog.boschin.it
Do the simplest thing that could possibly work [Kent Beck]

Valeria

unread,
Jun 27, 2007, 5:45:49 AM6/27/07
to
> 1) ti carichi i profili degli utenti e fai tu la selezione via codice,
> ma la cosa può essere un po' impegnativa ma credo si possa fare usando
> in modo furbo FindProfilesByUserName
> http://msdn2.microsoft.com/en-us/library/system.web.profile.profileprovider.findprofilesbyusername.aspx

Grazie per la risposta! A livello pratico non ho ben capito come gestire
questa soluzione :-(((

Andrea Boschin [XeDotNet]

unread,
Jun 27, 2007, 6:04:46 AM6/27/07
to
> Grazie per la risposta! A livello pratico non ho ben capito come gestire
> questa soluzione :-(((

Allora cerco di essere più esplicito:

Problema: trovare tutti gli utenti che hanno nel profilo la proprietà
"ComuneDiResidenza" impostata a "Treviso"

Soluzione: Il metodo FindProfilesByUserName ti consente di estrarre una
collezione di profili usando un criterio di ricerca nello username.

public override ProfileInfoCollection FindProfilesByUserName(
ProfileAuthenticationOption authenticationOption,
string usernameToMatch,
int pageIndex,
int pageSize,
out int totalRecords)

userNameToMatch può non essere un semplice username ma potrebbe essere
una chiave di ricerca con wildcard che ti restituisce fino a tutti i
profili di tutti gli utenti. Inoltre puoi usare pageIndex e pageSize per
limitare la quantità di dati che ti ritorna.

Una volta che hai estratto i profili degli utenti li puoi ciclare e
verificare quelli che ti servono e restituirli. Se conosci l'uso degli
iterator (yield) credo che in questo caso ti possano aiutare a
migliorare le performance.

ATTENZIONE: questo sistema vale solo se hai un numero limitato di utenti
perchè presuppone di caricare di volta in volta i profili di tutti gli
utenti. In caso di centinaia o migliaia di utenti è fortemente
sconsigliabile.

ciao!

Valeria

unread,
Jun 27, 2007, 6:15:51 AM6/27/07
to
> ATTENZIONE: questo sistema vale solo se hai un numero limitato di utenti
> perchè presuppone di caricare di volta in volta i profili di tutti gli
> utenti. In caso di centinaia o migliaia di utenti è fortemente
> sconsigliabile.

Grazie per la risposta... ecco allora credo proprio che non sia il mio
caso dato che gli utenti sono moltissimi :-((

A questo punto esiste qualche altra soluzione?? Il problema è che non
devo solo applicare una condizione ad un campo personalizzato del
profile ma anche (nella query della stored procedure) inserire
condizioni su altre tabelle.... lo sapevo che il memebership profile di
.NET 2.0 mi avrebbe complicato la vita :-((((((

Andrea Boschin [XeDotNet]

unread,
Jun 27, 2007, 7:55:57 AM6/27/07
to

Allora, cerchiamo di non buttare il bimbo assieme all'acqua sporca.
Credo possiamo trovare una soluzione intermedia che ti permetta di usare
il profile per le cose specifiche per cui ti può essere comodo e
risolvere anche il tuo problema.

Innanzitutto io eviterei di mettere mano alle stored procs perchè non
farai altro che crearti problemi in futuro anche se probabilmente adesso
sarebbe la soluzione più semplice.

Ti proporrei invece di customizzare il profile provider che usi
estendendolo. Ricordati che i providere sono classi che possono essere
estese. Tento per cominciare io creerei una classe MySqlProfileProvider
che estende SqlProfileProvider in questo modo:

public class MySqlProfileProvider : SqlProfileProvider
{
}

poi registrala al posto del provider di Sql standard

<add name="SqlProvider"
type="MySqlProfileProvider"
... altri parametri ...
/>

A questo punto dovrebbe funzionare tutto come prima salvo che passa
tutto per la tua classe e quindi puoi "intrometterti" e persistere le
informazioni che ti servono in una tabella che userai come indice
facendo l'override del metodi opportuni. Io proverei con SetPropertyValue();

public override void SetPropertyValues(SettingsContext context,
SettingsPropertyValueCollection collection)
{
SaveIndexedProperties(collection);
base.SetPropertyValues(context,collection);
}

nel metodo SaveIndexedProperties() che devi scriverti non fai altro che
salvare una riga per ogni utente con i campi relativi le proprietà che
ti serve indicizzare. Quella tabella la userai poi per trovare ggli
utenti che hanno nel profilo i valori richiesti, ma tutto il resto
continuerà a funzionare come prima (cioè non dovrai occuparti di
"rileggere" le proprietà.

Magari se ho tempo stasera faccio un tip nel blog.

Ciao!

Valeria

unread,
Jun 27, 2007, 8:30:02 AM6/27/07
to
Grazie per la risposta! Scusa ma non ho capito alcune parti

Io ho definito i campi del mio profile nel web.config ed la procedura di
salvataggio è realtivamente semplice grazie a questa funzionalità.

Tutto questo lo devo "buttare"??

> public class MySqlProfileProvider : SqlProfileProvider
> {
> }
>
> poi registrala al posto del provider di Sql standard
>
> <add name="SqlProvider"
> type="MySqlProfileProvider"
> ... altri parametri ...
> />
>
> A questo punto dovrebbe funzionare tutto come prima salvo che passa
> tutto per la tua classe e quindi puoi "intrometterti" e persistere le
> informazioni che ti servono in una tabella che userai come indice
> facendo l'override del metodi opportuni. Io proverei con
> SetPropertyValue();
>
> public override void SetPropertyValues(SettingsContext context,
> SettingsPropertyValueCollection collection)
> {
> SaveIndexedProperties(collection);
> base.SetPropertyValues(context,collection);
> }

Quindi mi sono persa, creo la mia classe MySqlProfileProvider

in SetPropertyValues cosa gestisco?? e da dove la richiamo?


> nel metodo SaveIndexedProperties() che devi scriverti non fai altro che
> salvare una riga per ogni utente con i campi relativi le proprietà che
> ti serve indicizzare.

Quindi nel DB devo creare una nuova tabella con i campi interessati per
ogni utente? (e non gestirli piu tramite profile??)


Tu mi dici di non usare una SP, io vorrei usare la soluzione piu
semplice ed immediata (dato che è già un problema ora dover modificare
la parte di profile) ma la SP a questo punto come la gestisco e da dove
la eseguo?

Grazie

Andrea Boschin [XeDotNet]

unread,
Jun 27, 2007, 9:07:48 AM6/27/07
to
> Io ho definito i campi del mio profile nel web.config ed la procedura di
> salvataggio è realtivamente semplice grazie a questa funzionalità.
>
> Tutto questo lo devo "buttare"??
>

no. con il mio sistema tutto continua a funzionare come prima. solo ti
crei una copia dei valori di profilo su una tabella di comodo che userai
solo per le query. una volta trovati gli username potrai usare il modo
consueto per leggere e scrivere i valori.

>
> Quindi mi sono persa, creo la mia classe MySqlProfileProvider
>
> in SetPropertyValues cosa gestisco?? e da dove la richiamo?
>
>

SetPropertyValues è un metodo del provider che viene chiamato per
salvare i dati del profilo. per intenderci quando chiami Profile.Save().
L'unica cosa che tu devi fare è salvarti una copia dei dati che trovi in
"collection" per l'utente (una riga di tabella).

>
> Quindi nel DB devo creare una nuova tabella con i campi interessati per
> ogni utente? (e non gestirli piu tramite profile??)
>

Esatto. una tabella con i soli campi che ti servono per cercare gli
utenti. Sarà una copia dei dati. I dati veri sono ancora nella tabella
della membership.

> Tu mi dici di non usare una SP, io vorrei usare la soluzione piu
> semplice ed immediata (dato che è già un problema ora dover modificare
> la parte di profile) ma la SP a questo punto come la gestisco e da dove
> la eseguo?

Mah. bisognerebbe capire qual'è la store che viene chiamata da
SetPropertyValues e modificarla in modo che ti salvi i dati nella solita
tabella di appoggio. Però come ti ho detto l'esempio che ti ho fatto è
ugualmente semplice ma più efficace.

0 new messages