Reputation: 4277
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
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