+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 7 su 7

Problema con textbox create da codice e sql

  1. #1
    rashid non è in linea Novello
    Salve.
    Ho un form con tre textbox, in una delle quali digito il numero delle nuove textbox da aggiungere.
    Il problema sorge quando devo inserire i dati di queste nuove textbox in una tabella di access. In pratica non riesco (anzi non so proprio come fare!!!) a mettere il nome di queste textbox nei parametri.

    Ho buttato giù questo:

    codice HTML:
                For i As Integer = 1 To txtNrate.Text
                    Dim textboxGG, textboxGGAdd As String
                    textboxGG = "txtGG" & i & ".Text"
                    textboxGGAdd = "txtGGAdd" & i & ".Text"
                    Dim dbcomm As OleDbCommand = dbconn.CreateCommand
                    dbconn.Open()
                    dbcomm.CommandType = CommandType.Text
                    dbcomm.CommandText = "INSERT INTO Condizioni (Condizione, Decorrenza, GG, GGAdd) value (?, ?, ?, ?)"
                    dbcomm.Parameters.AddWithValue("@condizione", txtCondizione.Text)
                    dbcomm.Parameters.AddWithValue("@decorrenza", txtDecorrenza.Text)
                    dbcomm.Parameters.AddWithValue("@gg", [B]textboxGG[/B])
                    dbcomm.Parameters.AddWithValue("@ggadd", [B]textboxGGAdd[/B])
                    txtCondizione.Focus()
                    dbcomm.ExecuteNonQuery()
                    dbconn.Close()
                Next
    Mi aiutate???

  2. #2
    Sgrubak non è in linea Scribacchino
    La costruzione del Command va fuori da ciclo For.
    1) Crea i parametri;
    2) Crea il Command e aggiungi i parametri;
    3) Ciclando cambi i valori ai parametri ed chiami l'ExecuteNonQuery

    Poi, non ci si rifersce così alle TextBox. Ok la costruzione del nome, ma poi devi cercare il controllo nella Collection in cui l'hai inserito:
    Dim textboxGG as TextBox
    textboxGG = TryCast(Me.Controls("txtGG" & i & ".Text"), TextBox)
    'Ora prendi il valore della propietà Text
    Dim stringa as String = textboxGG.Text
    
    EDIT: Anche l'apertura e la chiusura della connessione vanno fuori dal ciclo

  3. #3
    rashid non è in linea Novello
    Grazie Sgrubak.
    Ho seguito in parte il tuo consiglio, nel senso che ho lasciato fuori dal ciclo for l'apertura e la chiusura della connessione, perché quello che mi aspetto dalla mia routine è l'inserimento di tanti record quanto è il valore di txtNRate.text.

    Questa soluzione funziona ma solo in parte:
    effettivamente inserisco i record che voglio nella tabella, ma me li ripete.
            Dim dbcomm As OleDbCommand = dbconn.CreateCommand
            dbconn.Open()
            dbcomm.CommandType = CommandType.Text
            Dim textboxGG, textboxGGAdd As TextBox
            For i As Integer = 1 To txtNrate.Text
                textboxGG = TryCast(Me.Controls("txtGG" & i), TextBox)
                textboxGGAdd = TryCast(Me.Controls("txtGGAdd" & i), TextBox)
                dbcomm.CommandText = "INSERT INTO Condizioni (Condizione, Decorrenza, GG, GGAdd) values (?, ?, ?, ?)"
                dbcomm.Parameters.AddWithValue("@condizione", txtCondizione.Text)
                dbcomm.Parameters.AddWithValue("@decorrenza", txtDecorrenza.Text)
                dbcomm.Parameters.AddWithValue("@gg", textboxGG.Text)
                dbcomm.Parameters.AddWithValue("@ggadd", textboxGGAdd.Text)
                dbcomm.ExecuteNonQuery()
                MsgBox(i)
            Next
            dbconn.Close()
    
    E' come se venisse ignorata questa parte
    ("txtGG" & i)
    
    e quella riferita a txtGGAdd.

    Ho inserito un messagebox per verificare che il ciclo funzionasse, ed effettivamente funziona.

    Dove sbaglio???

  4. #4
    Sgrubak non è in linea Scribacchino
    Quote Originariamente inviato da rashid Visualizza il messaggio
    Dove sbaglio???
    Nel fatto che, come ti ho già specificato, i parametri vanno costruiti ed aggiunti una volta sola, quindi fuori dal ciclo e solo valorizzati nel ciclo... Dato che cambiano solo gli ultimi due, varierai la proprietà Value solo di quei parametri. Gli altri due li valorizzi fuori dal ciclo. Anche il CommandText non cambia e quindi anche lui va fuori dal ciclo.

    Per come hai scritto tu, continui ad inserire parametri. Se verificassi [dbcomm.Parameters.Count] scopriresti che invece di avere quattro parametri come vorresti ne avresti [4*txtNrate.Text], tutti con valori diversi. Ti inserisce tanti records quanto vale txtNrate.Text, sempre con gli stessi valori perché il comando sostituisce i quattro punti interrogativi coi primi quattro parametri che, per come hai impostato il ciclo tu, restano sempre uguali. Tutti quelli aggiunti dopo, vengono ignorati.

  5. #5
    rashid non è in linea Novello
    Ok risolto! Grazie mille!

  6. #6
    Sgrubak non è in linea Scribacchino
    Lieto di esserti stato di aiuto. Ricorda magari di lasciare la versione definiva del codice a beneficio di chi mai capiterà su questa discussione. Anche impostare la discussione come risolta aiuterebbe (nonostante titolo ed argomento discusso siano piuttosto scollegati...)

  7. #7
    rashid non è in linea Novello
    Certamente!
                Dim dbcomm As OleDbCommand = dbconn.CreateCommand
                dbconn.Open()
                dbcomm.CommandType = CommandType.Text
                dbcomm.CommandText = "INSERT INTO Condizioni (Condizione, Decorrenza, GG, GGAdd) values (?, ?, ?, ?)"
                Dim ParCondizione = dbcomm.Parameters.AddWithValue("@condizione", OleDbType.VarChar)
                Dim ParDecorrenza = dbcomm.Parameters.AddWithValue("@decorrenza", OleDbType.VarChar)
                Dim ParGG = dbcomm.Parameters.AddWithValue("@gg", OleDbType.VarChar)
                Dim ParGGAdd = dbcomm.Parameters.AddWithValue("@ggadd", OleDbType.VarChar)
                ParCondizione.Value = txtCondizione.Text
                ParDecorrenza.Value = txtDecorrenza.Text
                For i As Integer = 1 To txtNrate.Text
                    ParGG.Value = TryCast(Me.Controls("txtGG" & i), TextBox).Text
                    ParGGAdd.Value = TryCast(Me.Controls("txtGGAdd" & i), TextBox).Text
                    dbcomm.ExecuteNonQuery()
                Next
                dbconn.Close()
    
    Grazie ancora!

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 12
    Ultimo Post: 13-11-2015, 00:56
  2. Cancellare textbox da codice.
    Da Erik77 nel forum Microsoft Word
    Risposte: 1
    Ultimo Post: 07-05-2012, 12:04
  3. Risolto: Attivare eventi su label create da codice
    Da Marcixxx nel forum Visual Basic .Net
    Risposte: 7
    Ultimo Post: 31-08-2011, 01:55
  4. Creare una TextBox da codice
    Da dade_n nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 30-06-2011, 10:58
  5. [VB6] creare textbox da codice
    Da Aragosta nel forum Visual Basic 6
    Risposte: 17
    Ultimo Post: 14-12-2005, 20:29