Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    12

    Loop per lettura dati da db

    Devo leggere i dati di una tabella, questo è il mio codice:

    codice:
    conn.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True"
            Dim SelMatricola As SqlCommand = New SqlCommand("SELECT (Matricola) FROM [PostIt]", conn)
            conn.Open()
            Dim reader As SqlDataReader = SelMatricola.ExecuteReader()
            If reader.HasRows = True Then
                Do While reader.Read()
                    Matr.Text = reader.GetString(3).ToString
                Loop
            End If
            reader.Close()
            conn.Close()
    Se come parametro di GetString indico 0 funziona, utilizzando parametri <> 0 mi dà errore. Presumo che il loop non lo esegua e quindi riesca a leggere solo il primo elemento della tabella.

    Cosa sbaglio? Vi ringrazio in anticipo!

  2. #2
    la bestiola si comporta bene. visto che richiedi un solo campo, potrai usare solo GetString(0) -- cioè: leggi il primo campo; ogni indice maggiore ti darà errore.

    spiega meglio il tuo obiettivo

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244

    Re: Loop per lettura dati da db

    Originariamente inviato da devil.a
    Se come parametro di GetString indico 0 funziona, utilizzando parametri <> 0 mi dà errore. Presumo che il loop non lo esegua e quindi riesca a leggere solo il primo elemento della tabella.
    Puoi usare GetValue().

    Ma vedo che usi una User Instance quindi ti suggerisco di leggere questo post
    [vb.net] Indice oltre i limiti della matrice
    http://forum.html.it/forum/showthrea...ight=GetString


  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    12
    @ Optime
    Il mio obiettivo finale è di leggere una specifica riga della tabella il cui indice è contenuto in una variabile integer, Quindi:
    codice:
    Do While reader.Read()
          Matr.Text = reader.GetString(variabile).ToString
    Loop
    Siccome non funge (l'errore è: "Indice oltre i limiti della matrice."), ho provato a sostituire a questa variabile dei valori numerici e ho constatato che ponendola a 0 fornisce come risultato il primo elemento della tabella, con tutte le altre cifre dà lo stesso errore "Indice oltre i limiti della matrice.". Presumo che sbaglio il loop, ma non riesco a capire il motivo nonostante mille ricerche tra le varie guide e forum (preciso che non sono preparatissima in merito, forse è il motivo principale e perciò chiedo aiuto a voi!).

    @ Gibra
    Avevo già tentato di sostituire GetString() con GetValue() ma la situazione non cambia.
    Ho letto la discussione che mi hai linkato, ma soluzioni pratiche non ne vedo.
    Da ciò che c'è scritto e da quello che mi hai detto tu a proposito della User Instance deduco che mi suggerisci di cambiare stringa di connessione, giusto? Per tutte le operazioni della mia applicazione, semplici o complesse, ho usato quella e non mi ha mai dato problemi, o per lo meno gli incovenienti sono sempre riuscita ad ovviarli.

  5. #5
    se hai fatto così vuol dire che non sono stato chiaro

    l'indice di GetString è la colonna, mentre tu vuoi leggere una determinata riga.

    puoi:
    1. risolvere la cosa già con la query sql
    2. incrementare ad ogni passaggio un contatore ed uscire quando hai raggiuntola riga che ti interessa (metodo da brivido quando ti interessa la riga 9.999.999 su 10 milioni di righe!)

    vedi tu

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da devil.a
    @ Optime
    Il mio obiettivo finale è di leggere una specifica riga della tabella il cui indice è contenuto in una variabile integer, Quindi:
    codice:
    Do While reader.Read()
          Matr.Text = reader.GetString(variabile).ToString
    Loop
    Quindi stai sbagliando. GetString() e GetValue() restituiscono il valore di una colonna!
    Leggere la guida può esserti utile, magari.

    Originariamente inviato da devil.a
    @ Gibra
    Avevo già tentato di sostituire GetString() con GetValue() ma la situazione non cambia.
    Ho letto la discussione che mi hai linkato, ma soluzioni pratiche non ne vedo.
    Ovvio, dato che il tuo approccio è sbagliato.

    Originariamente inviato da devil.a
    Da ciò che c'è scritto e da quello che mi hai detto tu a proposito della User Instance deduco che mi suggerisci di cambiare stringa di connessione, giusto? Per tutte le operazioni della mia applicazione, semplici o complesse, ho usato quella e non mi ha mai dato problemi, o per lo meno gli incovenienti sono sempre riuscita ad ovviarli.
    A parte il fatto che se una cosa funziona oggi, non significa che funzionerà per sempre, ho solo voluto evidenziarti che le User Instance sono sconsigliate per due motivi:
    1) non portano alcun vantaggio, anzi il contrario (qualsiasi DB Administrator esperto te lo confermerà, e Luca Bianchi lo è di certo!)
    2) Microsoft le toglierà nelle prossime versioni.

    Poi vedi tu cosa fare...


  7. #7
    L'unico motivo per il quale puoi ricevere quel tipo di eccezione è che il record della tabella è composto da una sola colonna ..... e lo dimostra il fatto che nella Query di Select specifichi un solo nome di colonna (Matricola)
    Ad ogni modo, sistema la query e prova in questo modo:
    codice:
    drCarrello.Item(0).ToString
    drCarrello.Item(1).ToString
    drCarrello.Item(2).ToString
    etc...
    Facci sapere...
    Ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    12
    Grazie a tutti per i vari "contributi"
    Sono riuscita a risolvere così:
    codice:
    Dim sel As String = ListView1.SelectedValue
    Dim conn As New SqlConnection()
            conn.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True"
            Dim SelMatricola As SqlCommand = New SqlCommand("SELECT * FROM [PostIt] WHERE ([IdPostIt] = @sel)", conn)
            Dim MailPar As New SqlParameter("@sel", SqlDbType.NVarChar)
            SelMatricola.Parameters.Add(MatrPar)
            MatrPar.Value = ListView1.SelectedValue
            conn.Open()
            Dim reader As SqlDataReader = SelMatricola.ExecuteReader()
            If reader.HasRows = True Then
                Do While reader.Read()
                    Matr.Text = reader.Item(3).ToString
                Loop
            End If
            reader.Close()
            conn.Close()

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.