NiceToMytyuk
NiceToMytyuk

Reputation: 4277

How to update DataBase using parameters via ODBC?

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

Upvotes: 0

Views: 1122

Answers (1)

Mary
Mary

Reputation: 15091

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.

Upvotes: 1

Related Questions