348 messaggi dal 10 marzo 2013
Buongiorno a Tutti

Ho un problema con la restituzione del risultato delle query.
In pratica io ho una query della quale postero' il codice.
Il problema e' questo: Voglio visualizzare il risultato in una textbox,

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim conn As SqlConnection
Dim StrSelect As String
Dim CmdSelect As SqlCommand

conn = New SqlConnection("Data Source=.\SQLexpress;Initial Catalog=Pippo;Integrated Security=True")
StrSelect = " Select Cognome, Indirizzo, Telefono From T_Contatti WHERE Nome=@Nome "
CmdSelect = New SqlCommand(StrSelect, conn)

CmdSelect.Parameters.AddWithValue("@Nome", TxtNome.Text)

conn.Open()
TxtRQ.Text = CmdSelect.ExecuteScalar
conn.Close()
End Sub


In questo modo però ottengo solo la visualizzazione dei dati della prima colonna, ma non delle altre.
Io credo che il problema stia nell' ExecuteScalar, Ma non so con cosa sostituirlo. Tra le altre cose queste query diventeranno sempre più complesse in quanto ho la necessità di andare a leggere i dati da piu' tabelle.

Grazie a chiunque vorra' darmi una mano.
175 messaggi dal 02 gennaio 2012
Hi,

il metodo ExecuteScalar ritorna il numero di record
che la query selezionerà.

questo metodo NON ritorna dati della tabella

bye ghg
156 messaggi dal 01 dicembre 2010
non conosco bene "ExecuteScalar"

io farei un ciclo

    Protected Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click


        Dim cnxx    ' La connessione al DB
        cnxx = Server.CreateObject("ADODB.Connection")
        cnxx.Open("DRIVER={SQL Server};SERVER=NomeServer;UID=NomeUtente;PWD=ValorePass;DATABASE=Pippo")

        Dim Paxx As String  ' il patametro
        Paxx = Me.TxtNome.Text

        Dim Stxx As String     ' La stringa di query
        Stxx = "SELECT Cognome FROM T_Contatti WHERE Nome ='" & Paxx & "';"

        Dim rsxx             ' Il recordset
        rsxx = Server.CreateObject("ADODB.Recordset")
        rsxx.Open(Stxx, cnxx, 1)

        Dim StRQ As String
        StRQ = "Nessun Record"

        ' verifichiamo che il RecordSet non sia vuoto,   diversamente da un errore al   movefirst
        ' https://groups.google.com/forum/?hl=it#!topic/it.comp.appl.access/D-ORdDfuw1w
        If Not rsxx.eof Then
            StRQ = ""

            rsxx.movefirst()

            '  apriamo un ciclo
            Do Until rsxx.eof
                StRQ = StRQ & rsxx.fields("Cognome").Value & "   "
                rsxx.movenext()
            Loop

        End If

        TxtRQ.Text = StRQ

        rsxx.Close()
        rsxx = Nothing
        cnxx.Close()
        cnxx = Nothing


    End Sub
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

ghg ha scritto:

il metodo ExecuteScalar ritorna il numero di record

E' vero che, di solito, lo si usa con una query tipo "SELECT COUNT(*) FROM tabella", ma ExecuteScalar restituisce il valore contenuto nel primo campo del primo record trovato.

Nel caso della query di Oiram restituirebbe il Cognome del primo contatto trovato.

ghg ha scritto:

io farei un ciclo

Esatto, bisogna fare un ciclo, anche perché non è detto che quella query restituisca un solo risultato. Però non userei ADODB.Connection, perché è un oggetto ormai obsoleto. La soluzione consiste nell'usare gli oggetti SqlConnection e SqlCommand, come stava facendo Oiram, ma ottenendo i risultati con il metodo ExecuteReader.

Questo metodo restituisce un DataReader che permette di ciclare i risultati ottenuti.

Vado quindi ad integrare il codice di Oiram.
Using conn As New SqlConnection("Data Source=.\SQLexpress;Initial Catalog=Pippo;Integrated Security=True")
    Dim StrSelect As String = " Select Cognome, Indirizzo, Telefono From T_Contatti WHERE Nome=@Nome "
    Using CmdSelect As New SqlCommand(StrSelect, conn)
        CmdSelect.Parameters.AddWithValue("@Nome", TxtNome.Text)

        conn.Open()
        Using reader As SqlDataReader = CmdSelect.ExecuteReader()
            While reader.Read() 'continuo il ciclo finché ci sono risultati da leggere
                'Posso accedere ai campi con reader("nomecampo")
                TxtRQ.Text = String.Format("{0} {1} {2}", reader("Cognome"), reader("Indirizzo"), reader("telefono"))
            End While
        End Using
        conn.Close()
    End Using
End Using

Bravo Oiram per l'uso dei SqlParameter e per aver dimostrato come la connessione vada tenuta aperta per lo stretto tempo necessario. Ho aggiunto al tuo codice un blocco Using perché così ti assicuri che la connessione venga distrutta anche quando viene sollevata un'eccezione (es. il db non è raggiungibile, oppure la query va in errore).

Forse devi ritoccare la query SQL perché WHERE Nome=@Nome potrebbe restituirti più di un risultato. Quale nominativo, esattamente, vuoi mostrare in quel caso? Il primo? L'ultimo? Una concatenazione di tutti i loro recapiti?

ciao,
Moreno
Modificato da BrightSoul il 06 luglio 2014 11.24 -

Enjoy learning and just keep making
156 messaggi dal 01 dicembre 2010
BrightSoul ha scritto:

Bravo Oiram per l'uso dei SqlParameter e per aver dimostrato come la connessione vada tenuta aperta per lo stretto tempo necessario. Ho aggiunto al tuo codice un blocco Using perché così ti assicuri che la connessione venga distrutta anche quando viene sollevata un'eccezione (es. il db non è raggiungibile, oppure la query va in errore).

molto molto interessante :)
Scusatemi se rispondo io al posto di Oriam ( ma potrebbe essere utile anche per Oriam )
Nel codice proposto sopra noto che viene mostrato solamente l'ultimo record

Quindi potrei NON avere capito niente io
oppure ti e' "rimasto nella tastiera" il cuore del ciclo
che io farei a questo punto cosi:

Sto sbagliando qualcosa?? -- e' ancora migliorabile ??
        Dim stqu As String
        stqu = ""

        Using conn As New SqlConnection("Data Source=.\SQLexpress;Initial Catalog=Pippo;Integrated Security=True")
            Dim StrSelect As String = " Select Cognome, Indirizzo, Telefono From T_Contatti WHERE Nome=@Nome "
            Using CmdSelect As New SqlCommand(StrSelect, conn)
                CmdSelect.Parameters.AddWithValue("@Nome", TxtNome.Text)

                conn.Open()
                Using reader As SqlDataReader = CmdSelect.ExecuteReader()
                    While reader.Read() 'continuo il ciclo finché ci sono risultati da leggere
                        'Posso accedere ai campi con reader("nomecampo")
                        stqu = stqu & String.Format("{0} {1} {2}", reader("Cognome"), reader("Indirizzo"), reader("telefono"))
                    End While
                End Using
                conn.Close()
            End Using
        End Using

        Me.TxtRQ.Text = stqu


----------------------------------------

e ammesso che vada bene,
come faresti a dare un "acapo (VbNewLine)"
al testo visualizzato nella TextBox ad ogni cambio record ???

Grazie
Modificato da nman il 06 luglio 2014 15.13 -
Modificato da nman il 06 luglio 2014 15.18 -
Modificato da nman il 06 luglio 2014 16.47 -
3.939 messaggi dal 28 gennaio 2003

Ho un problema con la restituzione del risultato delle query.
In pratica io ho una query della quale postero' il codice.
Il problema e' questo: Voglio visualizzare il risultato in una textbox


Visualizzare il risultato di una query è facile. Ma prima bisogna chiedersi:

1) ottengo un solo record o più record?
2) se ottengo un solo record voglio visualizzare tutto il record o un solo campo?

3) ma è proprio necessario visualizzare il risultato in un TextBox, piuttosto che in un div?

4) e poi, come voglio mostrare i risultati? con una griglia? o in che modo?

detto questo, partirei dal codice di nman sostituendo però la stringa stqu con un StringBuilder, molto più veloce nei cicli.

Un qualcosa del genere (è solo un esempio)
Dim sb As New StringBuilder()
Using r As OleDbDataReader = msole.GetDataReader(gl.StringaConnessione, "select codice_istat_regione, nome_regione from regioni order by nome_regione")
  Do While (r.Read)
    sb.AppendFormat("codice_istat_regione: {0}, nome_regione: {1}", l.NullToString(r("codice_istat_regione")), l.NullToString(r("nome_regione")))
    sb.AppendLine()
  Loop
End Using
Me.TextBox1.Text = sb.ToString
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

nman ha scritto:

ti e' "rimasto nella tastiera" il cuore del ciclo

hai ragione. Non sapendo quanti e quali risultati andassero visualizzati, ho scritto giusto un abbozzo che mostrasse qualcosa a video.

Magari, come diceva Pietro, bisogna mostrare un'intera griglia di risultati e allora dovremo tirare in ballo una GridView o altro databound control. Aspettiamo. Penso che lo sapremo con certezza non appena avremo risposta da Oiram.

Ciao,
Moreno

Enjoy learning and just keep making
348 messaggi dal 10 marzo 2013
Ciao a tutti e grazie infinite per l'aiuto.

Prima di tutto avrei una domanda da fare a brightsoul:
Come dovrei cambiare la query perche' funzioni meglio ? Quello che vorrei fare io ( e mi sembrava funzionare) e' di inserire in una apposita textbox il nome e ottenere cosi i relativi dati correlati a quel nome.
Un ultima cosa, quello che ho postato e' solo un esempio per capire meglio, ma in realtà devo visualizzare molti più dati e soprattutto letti oltre cha da piu' colonne anche da piu' tabelle.
quale sarebbe poi la soluzione al posto di VbNewLine per poter visualizzare tutto?

Avrete senz'altro capito che non sono una cima sto cercando di imparare, ma più vado avanti e più mi accorgo di non sapere.

Chiedo scusa a tutti se non rispondo in fretta ma lavoro in un negozio e faccio orari un pò strani!!!. GRAZIE!!!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.