0

Actually i have a method where i insert some data to MySQL database via ODBC and when i get an exception i would try to update the value in the DB as most of the cases it would mean that the value yet exist.

The issue is that how can i update the DB using parameters? actually in Insert i use "?" as values and it works fine while in update it doesn't work and even by using param names it has no effects.

Here is my code

 Dim sqlInsert As String = "INSERT INTO prodotti(`Cod Articolo`, `Descrizione`, `Prezzo vend`, `Prezzo Acq`, `Iva`, `Data UV`, `Reparto`, `Descrizione Reparto`, `Famiglia/Gruppo`, 
`Descrizione Famiglia/Gruppo`, `Settore`, `Descrizione Settore`, `Marca`, `Cod Forn`, `Descrizione Fornitore`, `Sconto`, `RC`, `Prezzo EURO`, `Tipo_Frontal`, 
N_Frontal, `Tipo Riord`, `UM`, `Unita`, `Prezzo Unita`, `Peso_Unit`, `Unita_Misura`, `Data_Crea`, `Punti Promozione`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

Dim sqlUpdate As String = "UPDATE prodotti SET Descrizione = @CodArticolo, `Prezzo vend` = @Prezzovend, `Prezzo Acq` = @PrezzoAcq, Iva = @Iva, `Data UV` = @DataUV, 
Reparto = @Reparto, `Descrizione Reparto` = @DescrizioneReparto, `Famiglia/Gruppo` = @FamigliaGruppo, `Descrizione Famiglia/Gruppo` = @DescrizioneFamigliaGruppo, Settore = @Settore, 
`Descrizione Settore` = @DescrizioneSettore, Marca = @Marca, `Punti Promozione` = @PuntiPromozione, `Cod Forn` = @CodForn, `Descrizione Fornitore` = @DescrizioneFornitore, 
Sconto = @Sconto, Tipo_Frontal = @Tipo_Frontal, N_Frontal = @N_Frontal, `Tipo Riord` = @TipoRiord, UM = @UM, `Unita` = @Unita, `Prezzo Unita` = @PrezzoUnita, `Peso_Unit` = @PesoUnita, `Unita_Misura` = @Unita_Misura 
WHERE `Cod Articolo` = @CodArticolo"

Try
    dbCon.Open()
    For Each Row As DataRow In data.Rows
        Dim cmd As New Odbc.OdbcCommand
        With cmd
            .CommandType = CommandType.Text
            .CommandText = sqlInsert
            .Connection = dbCon
            .Parameters.AddWithValue("@CodArticolo", Row.Item("Cod Articolo"))
            .Parameters.AddWithValue("@Descrizione", Row.Item("Descrizione"))
            .Parameters.AddWithValue("@Prezzovend", Row.Item("Prezzo vend"))
            .Parameters.AddWithValue("@PrezzoAcq", Row.Item("Prezzo Acq"))
            .Parameters.AddWithValue("@Iva", Row.Item("Iva"))
            .Parameters.AddWithValue("@DataUV", Row.Item("Data UV"))
            .Parameters.AddWithValue("@Reparto", Row.Item("Reparto"))
            .Parameters.AddWithValue("@DescrizioneReparto", Row.Item("Descrizione Reparto"))
            .Parameters.AddWithValue("@FamigliaGruppo", Row.Item("Famiglia/Gruppo"))
            .Parameters.AddWithValue("@DescrizioneFamigliaGruppo", Row.Item("Descrizione Famiglia/Gruppo"))
            .Parameters.AddWithValue("@Settore", Row.Item("Settore"))
            .Parameters.AddWithValue("@DescrizioneSettore", Row.Item("Descrizione Settore"))
            .Parameters.AddWithValue("@Marca", Row.Item("Marca"))
            .Parameters.AddWithValue("@CodForn", Row.Item("Cod Forn"))
            .Parameters.AddWithValue("@Reparto", Row.Item("Reparto"))
            .Parameters.AddWithValue("@DescrizioneFornitore", Row.Item("Descrizione Fornitore"))
            .Parameters.AddWithValue("@Sconto", Row.Item("Sconto"))
            .Parameters.AddWithValue("@RC", Row.Item("RC"))
            .Parameters.AddWithValue("@PrezzoEURO", Row.Item("Prezzo EURO"))
            .Parameters.AddWithValue("@Tipo_Frontal", Row.Item("Tipo_Frontal"))
            .Parameters.AddWithValue("@N_Frontal", Row.Item("N_Frontal"))
            .Parameters.AddWithValue("@TipoRiord", Row.Item("Tipo Riord"))
            .Parameters.AddWithValue("@UM", Row.Item("UM"))
            .Parameters.AddWithValue("@Unita", Row.Item("Unita"))
            .Parameters.AddWithValue("@PrezzoUnita", Row.Item("Prezzo Unita"))
            .Parameters.AddWithValue("@Peso_Unit", Row.Item("Peso_Unit"))
            .Parameters.AddWithValue("@Unita_Misura", Row.Item("Unita_Misura"))
            .Parameters.AddWithValue("@Data_Crea", Row.Item("Data_Crea"))
            .Parameters.AddWithValue("@PuntiPromozione", Row.Item("Punti Promozione"))
        End With
        Try
            cmd.ExecuteNonQuery()
        Catch ex As Exception
            Try
                cmd.CommandText = sqlUpdate
                cmd.ExecuteNonQuery()
            Catch e As Exception
                MsgBox("game over")
            End Try

        End Try

    Next Row

Catch ex As Exception

Finally
    dbCon.Close()
End Try

UPDATE

As suggested by @Mary i've declared Parameters outside the loop and initialized them inside it.

SQLBindParameter

        Dim sqlInsert As String = "INSERT INTO prodotti(`Descrizione`, `Prezzo vend`, `Prezzo Acq`, `Iva`, `Data UV`, `Reparto`, `Descrizione Reparto`, `Famiglia/Gruppo`, 
`Descrizione Famiglia/Gruppo`, `Settore`, `Descrizione Settore`, `Marca`, `Cod Forn`, `Descrizione Fornitore`, `Sconto`, `RC`, `Prezzo EURO`, `Tipo_Frontal`, 
`N_Frontal`, `Tipo Riord`, `UM`, `Unita`, `Prezzo Unita`, `Peso_Unit`, `Unita_Misura`, `Data_Crea`, `Punti Promozione`, `Cod Articolo`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

        Dim sqlUpdate As String = "UPDATE prodotti SET `Descrizione` = ?, `Prezzo vend` = ?, `Prezzo Acq` = ?, `Iva` = ?, `Data UV` = ?, 
`Reparto` = ?, `Descrizione Reparto` = ?, `Famiglia/Gruppo` = ?, `Descrizione Famiglia/Gruppo` = ?, `Settore` = ?, 
`Descrizione Settore` = ?, `Marca` = ?, `Cod Forn` = ?, `Descrizione Fornitore` = ?, `Sconto` = ?, `RC` = ?, `Prezzo EURO` = ?, 
`Tipo_Frontal` = ?, `N_Frontal` = ?, `Tipo Riord` = ?, `UM` = ?, `Unita` = ?, `Prezzo Unita` = ?, `Peso_Unit` = ?, `Unita_Misura` = ?, `Data_Crea` = ?, `Punti Promozione` = ?
WHERE `Cod Articolo` = ?"

        Dim cmd As New Odbc.OdbcCommand
        With cmd
            .Connection = dbCon
            .CommandType = CommandType.Text
            .Parameters.Add("@Descrizione", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@Prezzovend", odbcType:=Odbc.OdbcType.Double)
            .Parameters.Add("@PrezzoAcq", odbcType:=Odbc.OdbcType.Double)
            .Parameters.Add("@Iva", odbcType:=Odbc.OdbcType.Double)
            .Parameters.Add("@DataUV", odbcType:=Odbc.OdbcType.DateTime)
            .Parameters.Add("@Reparto", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@DescrizioneReparto", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@FamigliaGruppo", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@DescrizioneFamigliaGruppo", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@Settore", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@DescrizioneSettore", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@Marca", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@CodForn", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@DescrizioneFornitore", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@Sconto", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@RC", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@PrezzoEURO", odbcType:=Odbc.OdbcType.Double)
            .Parameters.Add("@Tipo_Frontal", odbcType:=Odbc.OdbcType.Int)
            .Parameters.Add("@N_Frontal", odbcType:=Odbc.OdbcType.Int)
            .Parameters.Add("@TipoRiord", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@UM", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@Unita", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@PrezzoUnita", odbcType:=Odbc.OdbcType.Double)
            .Parameters.Add("@Peso_Unit", odbcType:=Odbc.OdbcType.Double)
            .Parameters.Add("@Unita_Misura", odbcType:=Odbc.OdbcType.VarChar)
            .Parameters.Add("@Data_Crea", odbcType:=Odbc.OdbcType.DateTime)
            .Parameters.Add("@PuntiPromozione", odbcType:=Odbc.OdbcType.Int)
            .Parameters.Add("@CodArticolo", odbcType:=Odbc.OdbcType.VarChar)
        End With

        Try
            dbCon.Open()
            For Each Row As DataRow In data.Rows
                cmd.CommandText = sqlInsert
                cmd.Parameters("@CodArticolo").Value = Row.Item("Cod Articolo")
                cmd.Parameters("@Descrizione").Value = Row.Item("Descrizione")
                If IsDBNull(Row.Item("Prezzo vend")) Then
                    cmd.Parameters("@Prezzovend").Value = DBNull.Value
                Else
                    cmd.Parameters("@Prezzovend").Value = Double.Parse(Row.Item("Prezzo vend"))
                End If
                If IsDBNull(Row.Item("Prezzo Acq")) Then
                    cmd.Parameters("@PrezzoAcq").Value = DBNull.Value
                Else
                    cmd.Parameters("@PrezzoAcq").Value = Double.Parse(Row.Item("Prezzo Acq"))
                End If
                If IsDBNull(Row.Item("Iva")) Then
                    cmd.Parameters("@Iva").Value = DBNull.Value
                Else
                    cmd.Parameters("@Iva").Value = Double.Parse(Row.Item("Iva"))
                End If
                If IsDBNull(Row.Item("Data UV")) Then
                    cmd.Parameters("@DataUV").Value = DBNull.Value
                Else
                    cmd.Parameters("@DataUV").Value = New Date(Row.Item("Data UV"))
                End If
                cmd.Parameters("@Reparto").Value = Row.Item("Reparto")
                cmd.Parameters("@DescrizioneReparto").Value = Row.Item("Descrizione Reparto")
                cmd.Parameters("@FamigliaGruppo").Value = Row.Item("Famiglia/Gruppo")
                cmd.Parameters("@DescrizioneFamigliaGruppo").Value = Row.Item("Descrizione Famiglia/Gruppo")
                cmd.Parameters("@Settore").Value = Row.Item("Settore")
                cmd.Parameters("@DescrizioneSettore").Value = Row.Item("Descrizione Settore")
                cmd.Parameters("@Marca").Value = Row.Item("Marca")
                cmd.Parameters("@CodForn").Value = Row.Item("Cod Forn")
                cmd.Parameters("@DescrizioneFornitore").Value = Row.Item("Descrizione Fornitore")
                cmd.Parameters("@Sconto").Value = Row.Item("Sconto")
                cmd.Parameters("@RC").Value = Row.Item("RC")
                If IsDBNull(Row.Item("Prezzo EURO")) Then
                    cmd.Parameters("@PrezzoEURO").Value = DBNull.Value
                Else
                    cmd.Parameters("@PrezzoEURO").Value = Double.Parse(Row.Item("Prezzo EURO"))
                End If
                If IsDBNull(Row.Item("Tipo_Frontal")) Then
                    cmd.Parameters("@Tipo_Frontal").Value = DBNull.Value
                Else
                    cmd.Parameters("@Tipo_Frontal").Value = CInt(Row.Item("Tipo_Frontal"))
                End If
                If IsDBNull(Row.Item("N_Frontal")) Then
                    cmd.Parameters("@N_Frontal").Value = DBNull.Value
                Else
                    cmd.Parameters("@N_Frontal").Value = CInt(Row.Item("N_Frontal"))
                End If
                cmd.Parameters("@TipoRiord").Value = Row.Item("Tipo Riord")
                cmd.Parameters("@UM").Value = Row.Item("UM")
                cmd.Parameters("@Unita").Value = Row.Item("Unita")
                If IsDBNull(Row.Item("Prezzo Unita")) Then
                    cmd.Parameters("@PrezzoUnita").Value = DBNull.Value
                Else
                    cmd.Parameters("@PrezzoUnita").Value = Double.Parse(Row.Item("Prezzo Unita"))
                End If
                If IsDBNull(Row.Item("Peso_Unit")) Then
                    cmd.Parameters("@Peso_Unit").Value = DBNull.Value
                Else
                    cmd.Parameters("@Peso_Unit").Value = Double.Parse(Row.Item("Peso_Unit"))
                End If

                cmd.Parameters("@Unita_Misura").Value = Row.Item("Unita_Misura")
                If IsDBNull(Row.Item("Data_Crea")) Then
                    cmd.Parameters("@Data_Crea").Value = DBNull.Value
                Else
                    cmd.Parameters("@Data_Crea").Value = New Date(Row.Item("Data_Crea"))
                End If
                If IsDBNull(Row.Item("Punti Promozione")) Then
                    cmd.Parameters("@PuntiPromozione").Value = DBNull.Value
                Else
                    cmd.Parameters("@PuntiPromozione").Value = CInt(Row.Item("Punti Promozione"))
                End If

                Try
                    cmd.ExecuteNonQuery()
                Catch ex As Exception
                    Try
                        cmd.CommandText = sqlUpdate
                        cmd.ExecuteNonQuery()
                    Catch e As Exception
                        MsgBox("Exception")
                    End Try

                End Try

            Next Row

        Catch ex As Exception

        Finally
            dbCon.Close()
        End Try

PS: i'm new in VB.NET

7
  • 3
    You don't loop through a DataTable and save one row at a time. You configure a data adapter and then save the entire table with a single call to its Update method. Also, unless you are required to use ODBC, you should use Connector/Net to work with MySQL databases. Commented Aug 12, 2019 at 15:24
  • @jmcilhinney actually i'm forced to use ODBC as the PC where this app will run can have access or mysql db (with same structure), can you make an example of use of data adapter? Commented Aug 12, 2019 at 15:31
  • @jmcilhinney so even the approach of how i insert the data is wrong? Commented Aug 12, 2019 at 15:32
  • DataBinding means never having to loop thru grid rows to populate, insert or update. The UI tools are designed to work with the DB provider pieces. Yet another alternative is ORMs Commented Aug 12, 2019 at 20:46
  • You would add the parameters just once outside the loop. Then just change the value property of the parameter in the loop. Commented Aug 13, 2019 at 0:29

1 Answer 1

1

Use Using...End Using blocks for your database objects if the expose a .Dispose method. They need to release unmanaged objects. The Using blocks accomplish this even if there is an error.

.AddWithValue can cause some problems. See http://www.dbdelta.com/addwithvalue-is-evil/ and https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ and another one: https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications

Try the .Add(String, OdbcType, Int32) method. String is the parameter name. OdbcType is the the type of the column in the database. Int32 is the size of the field, relavent to string types. Convert the types from your datatable to match. ADO.net does not always guess correctly when filling a datatable.

    'Example if the field is type Int
    .Parameters.Add("@CodArticolo", OdbcType.Int).Value = CInt(Row.Item("Cod Articolo"))
    'Example if the field is type VarChar
    .Parameters.Add("@Descrizione", OdbcType.VarChar, 50).Value = Row.Item("Descrizione")

I don't understand the reason you cannot use the MySql provider.

Sign up to request clarification or add additional context in comments.

2 Comments

Actually by using "?" as placeholder instead of name it's working, can you cheack please if i'm doing well the value filling?
Yes the question mark placeholders work just fine. It is the order they are added to parameters collection that must match the order that they appear in the Sql statement.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.