Creazione dinamica stringa Sql per Sqldatasource

martedì 10 marzo 2009 - 18.12

dibiax Profilo | Newbie

Problema: sui vorrebbe associare ad un dataset una stringa Sql di selezione in modo dinamico... mi spiego la necessita è quella di visualizzare un datagrid
associato ad un sqldtasource in base alla selezione di alcuni parametri , alcuni dei quali disponibili da combo ed altri da testo libero.
La soluzione più comoda sarebbe a mio parere quella di poter costruire la stringa sql e darla in pasto all'sqldatasource che poi collegato al datagrid
visualizzerebbe il risultato.
non riesco:
ho creato una variabile di tipo protected
Protected parametro As String = "SELECT [oggetto], [denominazione], [DatTec], [Famiglia], [Repa] FROM [oggetti] "
come faccio a darla in pasto al mio sqldatasource perchè venga eseguita e visualizzata?
grazie 1000!!!


la sapienza mi rincorre ma io sono più veloce!!!!

petronilla Profilo | Newbie

So che ormai non ne avrai piu bisogno ma rispondo per qualche altro povero disgraziato (come noi :) )

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

a questo punto hai a tua stringa di connessione a run time

Gluck74 Profilo | Guru

Ciao petronilla,
la soluzione che hai inviato, seppur funzionante, ha qualche problema di sicurezza, e non è del tutto corretta.

Per costruire una stringa dinamicamente, utilizzate l'autoconfigurazione dell'oggetto sqlDataSource, che in automatico crea la SQL dinamica, e imposta i parametri in base a controlli, form, session, ecc.....

Nella pagina aspx, includete l'oggetto sqlDataSource, cliccate su "Configura dataSource" (smar tag del controllo stesso) e si aprirà la configurazione guidata. Potete costruire dunque la vostra qery di select a piacere. Cliccando quindi sul pulsante per costruire la parte di "WHERE", scegliete quale sarà la sorgente da utilizzare per i valori dei parametri: Control, cookie, form, Profile, QueryString e Session.
Di seguito vi propongo un esempio dove ho costruito una query con 2 parametri, i quali valori saranno presi da due controlli textBox.

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT * FROM [Customers] WHERE (([City] = @City) AND ([Country] = @Country))"> <SelectParameters> <asp:ControlParameter ControlID="TextBox1" Name="City" PropertyName="Text" Type="String" /> <asp:ControlParameter ControlID="TextBox2" Name="Country" PropertyName="Text" Type="String" /> </SelectParameters> </asp:SqlDataSource>

petronilla Profilo | Newbie

Ciao Gluck,

sapevo che la mia soluzione non era perfetta ma era l'unica cosa che mi veniva in mente!

Dopo solo 1 mese finalemente qualcuno è riuscito ad essere chiaro ed a risolvere il mio problema!

Grazie mille!

x69asterix Profilo | Junior Member

oops ho sbagliato tread....

skraus Profilo | Junior Member

In relazione alla soluzione indicata da Gluck se in fase di esecuzione l'utente definisce un valore solo per il parametro City la query che verrà eseguita terrà comunque conto del parametro Country assegnandogli un parametro nullo ?

Ossia se l'esigenza è quella di avere una query il cui testo varia in funzione della quantità dei parametri di input per cui l'utente definisce un valore qual'è la soluzione (diversa dalla concatenazione di testo SQL) ?

Ciao
Sk

Gluck74 Profilo | Guru

Scusa se ripsondo solo adesso, ma per problemi di lavoro non sono più molto attivo.....

nel caso in cui i parametri devono essere opzionali, bisogna apportare alcune piccole modifiche:
La parte where della query deve diventare:

WHERE ((@Username='' OR [Username] = @Username) AND (@Email='' OR [Email] = @Email))

Mentre per i parametri dell'oggetto SqlDataSource, modificate come di seguito:
<asp:ControlParameter ControlID="TextBox1" Name="Username" PropertyName="Text" Type="String" DefaultValue="" ConvertEmptyStringToNull="false" /> <asp:ControlParameter ControlID="TextBox2" Name="Email" PropertyName="Text" Type="String" DefaultValue="" ConvertEmptyStringToNull="false" />

Notate "DefaultValue" e "ConvertEmptyStringToNull". Questo permette di lasciare vuoti i controlli che fungono da parametri, ed in questo caso viene usitlizzato il DefaultValue che è appunto una strigna vuota. La query in questo modo prende in considerazione questa opzione grazie all'aggiunta dell'operatore "OR" per entrambi i parametri.

ciao



____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

skraus Profilo | Junior Member

Ok, per quanto riguarda i parametri opzionali la tua soluzione mi è chiara. Ma il mio problema è dato dal fatto che il testo della Query (SELECT ... FROM ... INNER JOIN ....) deve cambiare in funzione dei controlli che l'utente seleziona e valorizza in un pannello di ricerca.

Esiste una soluzione alternativa alla concatenazione di valori string per la formulazione del testo della query, in ASP.NET 2.0 ?

Grazie ancora.

Ciao.
Sk

Gluck74 Profilo | Guru

ciao,

>Ok, per quanto riguarda i parametri opzionali la tua soluzione
>mi è chiara. Ma il mio problema è dato dal fatto che il testo
>della Query (SELECT ... FROM ... INNER JOIN ....) deve cambiare
>in funzione dei controlli che l'utente seleziona e valorizza
>in un pannello di ricerca.
devi considerare che l'oggetto SqlDataSource è "relativamente" semplice e serve per fare query velocemente e neanche troppo complicate.
Si può sempre modificare la query utilizzando gli evendi dell'oggetto, ad esempio "Selecting" oppure "Init".
In questi eventi puoi andare a costruirti la query in base alle scelte operate dall'utente.
Per quanto riguarda i valori, non è detto che siano sempre string. Dipende dalla colonna nel DB, anche il parametro dovrà essere dello stesso tipo.

>
>Esiste una soluzione alternativa alla concatenazione di valori
>string per la formulazione del testo della query, in ASP.NET
>2.0 ?
In effetti, per creare una query in base a parametri, la cosa più semplice è creare una stringa e poi passarla come query.
Ci sarebbero cose più sofisticate tipo LINQ o altri framework di EntityModel, ma potrebbero essere anche troppo onerosi, tutto dipende dal contesto.



>
>Grazie ancora.
>
>Ciao.
>Sk


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5