INSERT INTO in un ciclo while

di il
1 risposte

INSERT INTO in un ciclo while

Buongiorno,

ho due tabelle
Tabella Categorie (campi: ID, Categoria, UM, BaseSconto)
Tabella Listini ( campi: ID, Listino, Categoria, BaseScontoValue)

Devo aggiungere a Listini tanti record quante sono le categorie.

Ho provato a buttare giù questo codice:
        Dim basesconto As Double
        dbcomm.CommandText = "SELECT Categoria, BaseSconto FROM Categorie"
        dbconn.Open()
        reader = dbcomm.ExecuteReader
        While reader.Read
            If reader(1) = "BASE" Then
                basesconto = InputBox("Inserisci la base di prezzo per la categoria merceologia " & reader(0) & ".")
            Else
                basesconto = InputBox("Inserisci lo sconto per la categoria merceologia " & reader(0) & ".")
            End If
            dbcomm2.CommandText = "INSERT INTO Listini (Listino, Categoria, BaseScontoValue) values (?, ?, ?)"
            dbcomm2.Parameters.AddWithValue("@listino", txtListino.Text)
            dbcomm2.Parameters.AddWithValue("@categoria", reader(0))
            dbcomm2.Parameters.AddWithValue("@basesconto", Format(basesconto, "#0.0000"))
            dbcomm2.ExecuteNonQuery()
        End While
        reader.Close()
        dbconn.Close()
        dbcomm.CommandText = "SELECT ID, Listino, Categoria, BaseScontoValue FROM Listini"
        dbconn.Open()
        reader = dbcomm.ExecuteReader
        DataGridView1.Rows.Clear()
        While reader.Read
            DataGridView1.Rows.Add(reader(0), reader(1), reader(2), reader(3))
        End While
        reader.Close()
        dbconn.Close()
Ogni volta che il datareader legge qualcosa, inserisco un valore nell' inputbox e inserisce il record nel database.
Il problema è che mi ripete sempre lo stesso record.

Qualcuno mi aiuta? Grazie

1 Risposte

  • Re: INSERT INTO in un ciclo while

    turituri ha scritto:


    Ogni volta che il datareader legge qualcosa, inserisco un valore nell' inputbox e inserisce il record nel database.
    Il problema è che mi ripete sempre lo stesso record.
    Ogni volta che leggi un record dal DataReader, vai a impostare la query sul comando e ad aggiungere nuovi parametri a quelli esistenti, quindi il comando avrà sempre più parametri, ma continuerà a considerare solo i primi tre che hai definito alla prima iterazione.

    O ti premuri di rimuovere tutti i parametri dal comando che hai inserito, prima di aggiungerli di nuovo con AddWithValue, o crei direttamente il comando all'interno del ciclo, oppure - ancora meglio - crei comando, SQL e parametri una volta sola all'esterno del ciclo, e cambi solo il valore dei parametri prima di eseguire il comando, già definito e configurato in precedenza:
    
    Dim dbcomm2 As New OleDbCommand()
    dbcomm2.CommandText = "INSERT INTO Listini (Listino, Categoria, BaseScontoValue) values (?, ?, ?)"
    
    Dim parListino = dbcomm2.Parameters.Add("@Listino", OleDbType.VarChar)
    Dim parCategoria = dbcomm2.Parameters.Add("@Categoria", OleDbType.VarChar)
    Dim parBaseSconto = dbcomm2.Parameters.Add("@BaseScontoValue", OleDbType.VarChar)
    
    ' ...
    
    While reader.Read
    	If reader(1) = "BASE" Then
    		basesconto = InputBox("Inserisci la base di prezzo per la categoria merceologia " & reader(0) & ".")
    	Else
    		basesconto = InputBox("Inserisci lo sconto per la categoria merceologia " & reader(0) & ".")
    	End If
    	parListino.Value = txtListino.Text
    	parCategoria.Value = reader(0)
    	parBaseSconto.Value = Format(basesconto, "#0.0000")
    	dbcomm2.ExecuteNonQuery()
    End While
    
    reader.Close()
    
    Ovviamente, i tipi dei parametri (OleDbType) vanno definiti in base al valore di appartenenza del campo della tabella di destinazione.

    Ciao!
Devi accedere o registrarti per scrivere nel forum
1 risposte