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

标签 mysql vb.net odbc

实际上,我有一种方法,可以通过 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的建议,我在循环外部声明了参数并在循环内部初始化了它们。

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:我是 VB.NET 新手

最佳答案

如果公开 .Dispose 方法,请为数据库对象使用 Using...End using block 。他们需要释放非托管对象。即使出现错误,Using block 也能完成此任务。

.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/

相关文章:

sql-server - SQL Server 后端和 Access 前端 - 与 SQL Server native 客户端的 ODBC 连接失败

mysql - SELECT COUNT(*) 基于连接表条件

mysql - 加入结果并进行算术平均

由于 ODBC 数据流任务错误,SSIS 包在 VS 中有效,但在 SSIS 中无效

ASP.NET VB - 从类型 'DBNull' 到类型 'String' 的转换无效

mysql - 使用 VB.net 在 MySQL 数据库中存储马拉地语(印度语言)数据

sql-server - SQL 2000 中的 ODBC 问题 --> 2005 升级

php - mysql_connect() 没有到达正确的服务器

php - 在php函数中传递查询的字段名和表名?

linux - 单声道: "The runtime version supported by this application is unavailable"