实际上我有一种方法,我通过 ODBC 将一些数据插入 MySQL 数据库,当我遇到异常时,我会尝试更新数据库中的值,因为大多数情况下这意味着该值还存在。
问题是我如何使用参数更新数据库?实际上在插入中我使用“?”作为值,它工作正常,而在更新中它不起作用,即使使用参数名称也没有效果。
这是我的代码
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 所建议的,我已经在循环外声明了参数并在循环内初始化了它们。
SQL绑定参数
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:我是 VB.NET 的新手
如果公开
Using...End Using
方法,请为您的数据库对象使用 .Dispose
块。他们需要释放非托管对象。即使出现错误,Using 块也会完成此操作。
.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 提供程序的原因。