如何通过ODBC使用参数更新数据库?

问题描述 投票:0回答:1

实际上我有一种方法,我通过 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 的新手

mysql vb.net odbc
1个回答
1
投票

如果公开

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 提供程序的原因。

© www.soinside.com 2019 - 2024. All rights reserved.