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

    Problema Sul select con DB Access

    Salve a tutti, io ho una pagina in cui ci sono una lista di link, cliccando su ad un link in un iframe mi apre la descrizione chiamata dal database :

    Dim connessione As New System.Data.OleDb.OleDbConnection()
    Dim sql As New System.Data.OleDb.OleDbCommand()
    Dim rs As OleDbDataReader

    connessione.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("new.mdb") & ";Persist Security Info=False"

    Try
    sql.CommandText = "SELECT * FROM Tabella WHERE Ric = '" & Request.QueryString("ric") & "'"
    sql.Connection = connessione
    connessione.Open()

    rs = sql.ExecuteReader()
    If rs.Read Then
    lbldesc.Text = rs.Item("Descrizione")
    End If
    rs.Close()
    rs = Nothing
    sql.Connection.Close()
    connessione.Close()
    Catch ex As OleDbException

    End Try
    --------------------
    fino a quì tutto bene, alla fine di questa descrizione ho messo un link che fa selezionare questo tipo di descrizione e dovrebbe andare ad updare un campo della taballa stessa è inserire questa descrizione, mandando con questo link, la ricerca del primo link sopra citato.
    nella pagina di update, mi richiamo dinuovo il select di sopra per pigliarmi anche le altre informazioni relative a quella ricerca in questo modo :

    Dim connessione1 As New System.Data.OleDb.OleDbConnection()
    Dim sql1 As New System.Data.OleDb.OleDbCommand()
    Dim rs1 As OleDbDataReader

    connessione1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("new.mdb") & ";Persist Security Info=False"

    Try
    sql1.CommandText = "SELECT * FROM tabella WHERE Ric = '" & Request.QueryString("ric") & "'"
    sql1.Connection = connessione1
    connessione1.Open()

    rs1 = sql1.ExecuteReader()
    Dim campo_nome, campo2
    If rs1.Read Then
    campo_nome = rs1.Item("nome")
    campo2 = rs1.Item("FO")
    End If

    rs1.Close()
    rs1 = Nothing
    sql1.Connection.Close()



    Session("sezione") = "1"

    Response.Redirect("index.aspx")

    Catch ex As OleDbException
    End Try

    ---------------
    in questo select apparentemente uguale non mi ricava nessun risultato quindi quando vado a fare il reader non mi trova nulla è non mi da i valori per i campi dichiarati nella pagina di update.


    qualcuno sa il perchè non ne riesco a venire a capo del perchè :\

  2. #2
    il codice che hai scritto non è... scritto bene.
    Le select tornano un solo risultato? Se la risposta è si, sbagli ad usare un datareader. In questo caso, si usa la funzione executescalar del command che appunto serve per leggere un singolo valore. In più, usi male il blocco try catch. La gestione delle eccezioni, la fai solo se devi... gestire l'eccezione ad esempio per loggare l'errore e/o per segnalarlo all'utente. Se nel catch non ci metti nulla, non devi usare il try catch altrimenti corri il rischio di nascondere le eventuali eccezioni e non capire cosa succede.
    In più, un oggetto connection, va sempre chiuso nella sezione Finally altrimenti in caso di eccezioni rimarrà aperto.
    http://msdn.microsoft.com/en-us/library/tyy0sz6b.aspx
    Saluti a tutti
    Riccardo

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    12
    giusto per la chiusura del database mi hai dato un ottimo consiglio, ma per quanto riguarda il primo bloco try che ho esposto funziona regolarmente anche se nel rs.Reader vado a ricavarmi solo un risultato, mentre nel secondo blocco try che ho copiato dal mio codice la query di select nella condizione WHERE non mi ricava alcun risultato, quando la query di select è identica al primo blocco try, inoltre ho provato a stampare a video il request.querystring che mi porto ed effettivamente il valore se lo porta ed è lo stesso della prima pagina.

    cosa può essere?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    12
    adesso ho fatto caso ad una cosa in realtà la query di select funziona infatti ho provato a mettere una label è chiamarmi un campo lo visualizza, ma dopo ho degli update in questo modo :

    Dim cmd As New OleDbCommand("UPDATE Iscrizione Set Taglia = '" & Taglia & "', nome = '" & campo_nome & "' WHERE Identificativo = " & Session("identificativo") & "'", New OleDbConnection(connessione1.ConnectionString))

    cmd.Connection.Open()
    cmd.ExecuteNonQuery()
    cmd.Connection.Close()

    Dim cmd2 As New OleDbCommand("UPDATE Abilitazione Set Classe = '1', Caratteristiche = '0', Personalizza = '0' WHERE Identificativo = '" & Session("identificativo") & "'", New OleDbConnection(connessione1.ConnectionString))

    cmd.Connection.Open()
    cmd.ExecuteNonQuery()
    cmd.Connection.Close()

    Session("classe") = "1"

    Response.Redirect("index.aspx")

    questo codice è inserito dopo la query di select del seocndo blocco try che ho inserito nel primo topic

  5. #5
    Originariamente inviato da cicico
    giusto per la chiusura del database mi hai dato un ottimo consiglio,
    solo per quello? vabe' meglio che niente

    Originariamente inviato da cicico ma per quanto riguarda il primo bloco try che ho esposto funziona regolarmente anche se nel rs.Reader vado a ricavarmi solo un risultato,
    aaah... ma allora non è solo la chiusura ma anche altro . Non è che usare un datareader per leggere un singolo valore non funzioni. Il fatto è che per leggere un singolo valore dovresti imparare ad usare la funzione fatta adhoc e cioè tuocommand.executescalar

    mentre nel secondo blocco try che ho copiato dal mio codice la query di select nella condizione WHERE non mi ricava alcun risultato, quando la query di select è identica al primo blocco try, inoltre ho provato a stampare a video il request.querystring che mi porto ed effettivamente il valore se lo porta ed è lo stesso della prima pagina.
    Per vedere cosa c'e' nei valori non devi stampare a video niente. Ti basta imparare a usare i breackpoint e in debug osservare come sta funzionando il tuo codice passo passo. In più, ti ripeto che devi togliere il blocco catch se non ti serve altrimenti non sai cosa succede.

    cosa può essere?
    Impara a usare la funzione giusta per le operazioni di lettura. Se devi leggere più risultati (più records e/o più colonne) usa il datareader altrimenti usa executescalar. Questo ti semplifica il codice. Meno righe di codice = meno errori.
    Non mettere blocchi catch quando non ti servono. Così eviterai di nascondere i problemi (es. cerchi di leggere una colonna che è null).
    Saluti a tutti
    Riccardo

  6. #6
    Originariamente inviato da cicico
    adesso ho fatto caso ad una cosa in realtà la query di select funziona infatti ho provato a mettere una label è chiamarmi un campo lo visualizza, ma dopo ho degli update in questo modo :

    non mi sembra che creare un procedurone che fa n select e n update sia il massimo della vita. Prova a crearti singole funzioni per singole operazioni. Infine, non dovresti costruirti la query che esegui sul db appiccicando i valori con la &. E' importante che impari ad usare i parametri. Sono più semplici e ti mettono al riparo da tanti problemi tra cui il formato dei dati e sqlinjection.
    Approfondisci il corretto uso di ado.net in particolare delle tecniche per aprire e chiudere connessioni senza rischi.
    es. scritto a manina quindi occhio alla sintassi
    codice:
    Using connection As New OleDbConnection(connectionString)        
            Dim command As OleDbCommand = New OleDbCommand("UPDATE tabella SET citta = ? WHERE tuoid = ?", connection)
    	command.parameters.add("?", OleDbType.Varchar).Value = "Rimini"
    	command.parameters.add("?", OleDbType.Int).Value = 125
            command.ExecuteNonQuery
    End Using
    Saluti a tutti
    Riccardo

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.