Strano errore con querystring...

domenica 14 novembre 2010 - 23.02

mauri1961 Profilo | Senior Member

Ripropongo un problema occorsomi alcuni giorni or sono che non sono ancora riuscito a risolvere.

Ho una gridview dalla quale seleziono righe che devono aprire una pagina nuova e mostrarmi il dettaglio di tali dati con la possibilità di modificarli.

Ho utilizzato dalla grid view due campi che nella nuova pagina passo attraverso request.querystring.
I campi arrivano correttamente e si visualizzano infatti nella nuova pagina. Ma il resto dei dati non si vedono.
Per controprova ho aggiunto una detail view con tutti i dati che si vede perfettamente passando i due campi

mostro ora il codice "incriminato".

Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
ubicazione.Text = Request.QueryString("LKOPERA")
committente.Text = Request.QueryString("lkcomm")
operazione.Text = "MODIFICA"

Dim conn As New SqlConnection("Data Source=DELL-PORTATILE; Initial Catalog=NOTIFICHE;Integrated Security=SSPI")
Dim command As New SqlCommand("select * from notifiche_01 where not_opera=' " & Request.QueryString("lkopera").ToString() & "' and not_committente=' " & Request.QueryString("lkcomm").ToString() & "'", conn)
conn.Open()
Dim dr1 As SqlDataReader = command.ExecuteReader()
If dr1.Read Then
comunica.SelectedDate = dr1("not_comunicazione").date
ubicazione.Text = dr1("not_opera").ToString
indirizzo.Text = dr1("not_indirizzo").ToString
comune.SelectedValue = dr1("not_localita").ToString
committente.Text = dr1("not_committente").ToString
comm_cf.Text = dr1("not_comm_cf").ToString
responsabile.Text = dr1("not_responsabile").ToString
resp_cf.Text = dr1("not_resp_cf").ToString
coordinatore.Text = dr1("not_coord1").ToString
coord_cf.Text = dr1("not_cor1_cf").ToString
comm_cf.Text = dr1("not_comm_cf").ToString
dataini.Text = dr1("not_inizio").date
datafin.Text = dr1("not_fine").date
impresa.SelectedValue = dr1("not_impresa").ToString
impresanoniscritta.Text = dr1("not_impresa_noniscritta").ToString
comunesede.Text = dr1("not_comune").ToString
partitaiva.Text = dr1("not_impr_cf").ToString
importo.Text = CDec(dr1("not_importo"))
Label22.Text = comunica.SelectedDate.ToShortDateString

End If
conn.Close()

come dicevo questi campi:
ubicazione.Text = Request.QueryString("LKOPERA")
committente.Text = Request.QueryString("lkcomm")
operazione.Text = "MODIFICA"

si vedono, mentre quelli risultanti dalla select no.

Inserendo una detailview questa si vede perfettamente (la select è la medesima..)

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
DataSourceID="SqlDataSource3" Height="50px" Width="125px">
<Fields>
<asp:BoundField DataField="not_comunicazione" HeaderText="not_comunicazione"
SortExpression="not_comunicazione" />
<asp:BoundField DataField="not_opera" HeaderText="not_opera"
SortExpression="not_opera" />
<asp:BoundField DataField="not_indirizzo" HeaderText="not_indirizzo"
SortExpression="not_indirizzo" />
<asp:BoundField DataField="not_localita" HeaderText="not_localita"
SortExpression="not_localita" />
<asp:BoundField DataField="not_committente" HeaderText="not_committente"
SortExpression="not_committente" />
<asp:BoundField DataField="not_comm_cf" HeaderText="not_comm_cf"
SortExpression="not_comm_cf" />
<asp:BoundField DataField="not_responsabile" HeaderText="not_responsabile"
SortExpression="not_responsabile" />
<asp:BoundField DataField="not_resp_cf" HeaderText="not_resp_cf"
SortExpression="not_resp_cf" />
<asp:BoundField DataField="not_coord1" HeaderText="not_coord1"
SortExpression="not_coord1" />
<asp:BoundField DataField="not_cor1_cf" HeaderText="not_cor1_cf"
SortExpression="not_cor1_cf" />
<asp:BoundField DataField="not_inizio" HeaderText="not_inizio"
SortExpression="not_inizio" />
<asp:BoundField DataField="not_fine" HeaderText="not_fine"
SortExpression="not_fine" />
<asp:BoundField DataField="not_impresa" HeaderText="not_impresa"
SortExpression="not_impresa" />
<asp:BoundField DataField="not_impresa_noniscritta"
HeaderText="not_impresa_noniscritta" SortExpression="not_impresa_noniscritta" />
<asp:BoundField DataField="not_impr_cf" HeaderText="not_impr_cf"
SortExpression="not_impr_cf" />
<asp:BoundField DataField="not_comune" HeaderText="not_comune"
SortExpression="not_comune" />
<asp:BoundField DataField="not_importo" HeaderText="not_importo"
SortExpression="not_importo" />
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="SqlDataSource3" runat="server"
ConnectionString="<%$ ConnectionStrings:NOTIFICHEConnectionString %>"
SelectCommand="SELECT * FROM [notifiche_01] WHERE (([not_committente] = @not_committente) AND ([not_opera] = @not_opera))">
<SelectParameters>
<asp:QueryStringParameter Name="not_committente" QueryStringField="LKCOMM"
Type="String" />
<asp:QueryStringParameter Name="not_opera" QueryStringField="LKOPERA"
Type="String" />
</SelectParameters>
</asp:SqlDataSource>


sicuramente sbaglio qualcosa...ma va a capire cosa...

grazie, Maurizio

sankyu Profilo | Senior Member

prova con i parametri
Dim command As New SqlCommand("select * from notifiche_01 where not_opera='@par1' and not_committente='@par2' ", conn)
command.parameters.addwithvalue("@par1", Request.QueryString("lkopera").ToString() )
command.parameters.addwithvalue("@par2", Request.QueryString("lkcomm").ToString() )

Ricorda che non devi mai mettere le clausole where con dati che arrivano da query string o comunque campi modificabili dall'utente senza parametri se no ti becchi una bella sql injection e ti salta tutto il db !!!! OCCHIO!!!

ps ho scritto senza VS ed intellisense può essere che la sintassi non sia completamente esatta!!



Consulente e Sviluppatore .net in ambito finanziario
Dai un occhio al mio blog potrebbe tornarti utile
http://dotnetmemo.blogspot.com

mauri1961 Profilo | Senior Member

Ti ringrazio innanzitutto per il prezioso suggerimento che ho immediatamente adottato (la sintassi era corretta), tuttavia continuo a non visualizzare i dati nei campi textbox, mentre la details view mostra tutti i dati.
E' possibile che ci sia qualcosa di errato nella definizione del comando execute.reader?

dim dr1 as sqldatareader = command.executereader()
if dr1.read then()
indirizzo.text = dr1("not_indirizzo").tostring

...seguono gli altri campi....

grazie, Maurizio

sankyu Profilo | Senior Member

l'unico dubbio che ho è che nel momento in cui fai
if dr.read il risultato sia false (praticamente ti restituisce false se non ci sono dati ) e quindi non legga
per il resto la sintassi mi sembra corretta anche se di solito tengo separati dichiarazione da assegnamento per rendere il codice più leggibile
ex:

dim dr as sqldatareader
dr = command.executereader()
while dr.read
txt.text=dr("Posizione").toString
end While

Fai Così togli il if dr.read e metti dr.read e basta e vedi cosa fa in teoria dovrebbe dare errore per assenza di dati



Consulente e Sviluppatore .net in ambito finanziario
Dai un occhio al mio blog potrebbe tornarti utile
http://dotnetmemo.blogspot.com

mauri1961 Profilo | Senior Member

hai ragione !, levando la condizione if mi segnala errore con la causale di assenza dati.....

Ho anche modificato il codice utilizzando la while ma nulla di invariato rispetto a prima.

Come è possibile che non intercetti i dati (penso dalla select...) quando nella details view con la stessa select nella stessa pagina funziona?

select in page_load

Dim command As New SqlCommand("select * from notifiche_01 where not_committente='@par2' and not_opera='@par1'", conn)
command.Parameters.AddWithValue("@par1", Request.QueryString("lkopera").ToString())
command.Parameters.AddWithValue("@par2", Request.QueryString("lkcomm").ToString())

select in details view

<asp:SqlDataSource ID="SqlDataSource3" runat="server"
ConnectionString="<%$ ConnectionStrings:NOTIFICHEConnectionString %>"
SelectCommand="SELECT * FROM [notifiche_01] WHERE (([not_committente] = @not_committente) AND ([not_opera] = @not_opera))">
<SelectParameters>
<asp:QueryStringParameter Name="not_committente" QueryStringField="LKCOMM"
Type="String" />
<asp:QueryStringParameter Name="not_opera" QueryStringField="LKOPERA"
Type="String" />
</SelectParameters>


...mi spiace di farti perdere tempo...

grazie, Maurizio

sankyu Profilo | Senior Member

non ti preoccupare non ho molto da fare ultimamente!!
Comunque secondo me è una questione di spazi che finiscono nella query string
prova ad eseguire il reader senza parametri di tipo variabile ma mettendo il valore direttamente
Esempio

Dim command As New SqlCommand("select * from notifiche_01 where not_committente='@par2' and not_opera='@par1'", conn)
command.Parameters.AddWithValue("@par1", "Valore1")
command.Parameters.AddWithValue("@par2", "Valore2")

e vedi se va se anche così non va prova a fare così e vedi se va

Dim command As New SqlCommand("select * from notifiche_01 where not_committente='Valore1' and not_opera='Valore2", conn)



Consulente e Sviluppatore .net in ambito finanziario
Dai un occhio al mio blog potrebbe tornarti utile
http://dotnetmemo.blogspot.com

mauri1961 Profilo | Senior Member

anche in questo caso nulla da fare...

ciao, Maurizio

PEPE Profilo | Senior Member

Sinceramente non ho mai messo i parametri tra apici :D.

Saluti,
Luca.

sankyu Profilo | Senior Member

se sono di tipo stringa li devi mettere tra gli apici voglio vederti a fare una
select * from disney where nomepersonaggio=topolino

oppure

select * from disney where nomepersonaggio='topolino'

Consulente e Sviluppatore .net in ambito finanziario
Dai un occhio al mio blog potrebbe tornarti utile
http://dotnetmemo.blogspot.com

mauri1961 Profilo | Senior Member

fino a domani mattina non posso fare nulla in quanto sono scollegato dal server, comunque nella prova gli apici li avevo messi.

Non sarà che il problema sia la definizione del campo della tabella sql ? nvarchar(50)...

Ciao, Maurizio

PEPE Profilo | Senior Member

Scusami sankyu,
io ho semplicemente scritto i parametri perche nella query che hai postato li hai messi tra apici
---------------------
Dim command As New SqlCommand("select * from notifiche_01 where not_committente='@par2' and not_opera='@par1'", conn)
---------------------
@par2 e @par1 dato che sono due parametri non vanno inseriti nelle apici perche senno li prende come testo e non come parametro, altrimenti come si fa a distinguere i due casi?

Tutti qui,
saluti,
Luca.

sankyu Profilo | Senior Member

scusate!! ha ragione pepe è una mia svista
i parametri con @ non vanno tra apici!!! riprova senza apici!!
Grazie pepe

Consulente e Sviluppatore .net in ambito finanziario
Dai un occhio al mio blog potrebbe tornarti utile
http://dotnetmemo.blogspot.com

mauri1961 Profilo | Senior Member

ora funziona !!!!!

quindi tirando le somme è fondamentale parametrizzare le querystring in quanto oltre che rendere più sicuro eventuali accessi mariuoli evita di perdere giornate a cercare di capire come mai non funziona la select...

GRAZIE !!!!

...ALLA PROSSIMA...
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