实际上,我有一种方法,其中我通过ODBC将一些数据插入MySQL数据库,并且当我遇到异常时,我将尝试更新DB中的值,因为在大多数情况下,这将意味着该值仍然存在。
问题是如何使用参数更新数据库?其实在插入我用“?”作为值,它可以正常工作,而在更新时不起作用,即使使用参数名称也没有效果。
这是我的代码
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
更新
正如@Mary所建议的那样,我已在循环外声明了Parameters并在循环内对其进行了初始化。
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("hai la mamma troia")
End Try
End Try
Next Row
Catch ex As Exception
Finally
dbCon.Close()
End Try
PS:我是VB.NET的新手
最佳答案
如果公开了Using...End Using
方法,请对数据库对象使用.Dispose
块。他们需要释放非托管对象。即使出现错误,使用模块也可以完成此操作。.AddWithValue
可能会导致一些问题。见http://www.dbdelta.com/addwithvalue-is-evil/
和
https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
还有一个:
https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications
尝试.Add(String, OdbcType, Int32)
方法。字符串是参数名称。 OdbcType是数据库中列的类型。 Int32是字段的大小,与字符串类型有关。将数据表中的类型转换为匹配。填充数据表时,ADO.net并不总是能正确猜测。
'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")
我不明白您不能使用MySql提供程序的原因。
关于mysql - 如何通过ODBC使用参数更新数据库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57463752/