用于插入/更新 MySql DB 的函数返回错误的“受影响的行”数

Posted

技术标签:

【中文标题】用于插入/更新 MySql DB 的函数返回错误的“受影响的行”数【英文标题】:Function for inserting/updating MySql DB returns wrong "affected rows" number 【发布时间】:2015-12-23 17:58:08 【问题描述】:

我正在使用下面的代码插入或更新使用来自DataTable 的值的mysql

Function DB_Multi_Ins_Or_Upd_From_DT(ByVal dt As DataTable, ByVal DestTbl$) As Integer
    Using SQLConnection As New MySqlConnection(CnStr) 
        Using sqlCommand As New MySqlCommand()
            Dim CmdTxt$ = "INSERT INTO " & DestTbl & " ("
            For Each Col As DataColumn In dt.Columns
                CmdTxt &= Col.ColumnName & ", "
            Next
            CmdTxt = CmdTxt.Substring(0, CmdTxt.Length - 2) & ") VALUES ("
            For x As Integer = 0 To dt.Rows.Count - 1
                For xx As Integer = 0 To dt.Columns.Count - 1
                    CmdTxt &= "@" & "R" & x.ToString & "C" & xx.ToString & ", "
                    sqlCommand.Parameters.AddWithValue _
                        ("@" & "R" & x.ToString & "C" & xx.ToString, dt.Rows(x)(xx))
                Next xx
                CmdTxt = CmdTxt.Substring(0, CmdTxt.Length - 2) & "), ("
            Next x
            CmdTxt = CmdTxt.Substring(0, CmdTxt.Length - 3)
            CmdTxt &= " ON DUPLICATE KEY UPDATE "
            For Each Col As DataColumn In dt.Columns
                CmdTxt &= Col.ColumnName & "=VALUES(" & Col.ColumnName & "), "
            Next
            CmdTxt = CmdTxt.Substring(0, CmdTxt.Length - 2)
            With sqlCommand
                .CommandText = CmdTxt
                .Connection = SQLConnection
                .CommandType = CommandType.Text
            End With
            Try
                SQLConnection.Open()
                Dim AffRows% = sqlCommand.ExecuteNonQuery()
                Return AffRows
            Catch ex As MySqlException
                Return -1
            Finally
                SQLConnection.Close()
            End Try
        End Using
    End Using
End Function

恰好代码更新了 1 行但返回 2。

编辑:似乎只在update 上返回错误结果,而在insert 上返回正确数量的受影响行

怎么了?如何修复并获得正确的受影响行数?

编辑:测试我需要的代码:

1) 导入 MySql.Data.MySqlClient

2) 给cnstr 赋值 "datasource=" + Server_Name + ";username= " + UserDB + ";password=" + 密码 + ";database=" + Database_Name + ""

3) 创建一个DataTable,其列名类似于数据库表的字段

4) 调用传递DataTable和表名的函数 在数据库上

【问题讨论】:

那你能显示你的更新代码吗? @Steve 你是什么意思?要更新,我使用发布的函数将 DataTable 传递给它。这是我的代码。当一行已经存在时,它将被更新 抱歉,错过了“ON DUPLICATE KEY UPDATE”,请参阅下面 MySQL 文档中的答案。 【参考方案1】:

如果使用 ON DUPLICATE KEY UPDATE,每行的受影响行值为 1,如果 该行作为新行插入,如果现有行被更新,则为 2,并且 如果将现有行设置为其当前值,则为 0

dev.mysql.com

【讨论】:

所以我永远无法知道受影响行的有效数量!如果返回 4,则可能更新了两行,或者插入了 4 行,或者更新了 1 行并插入了 2 行?有没有办法获取详细信息? 当然,不要使用该函数,而是编写更新或插入 sql 语句。这将为您提供正确的号码。【参考方案2】:

来自微软

当正在插入或更新的表上存在触发器时,(ExecuteNonQuery)的返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数

所以,要么是重复计算受影响的行数,要么实际上是在更新 2 行。

【讨论】:

我没有任何触发器,似乎只有在更新时才返回错误的数字

以上是关于用于插入/更新 MySql DB 的函数返回错误的“受影响的行”数的主要内容,如果未能解决你的问题,请参考以下文章

从插入语句的函数返回mysql错误消息

java对mysql进行批处理插入数据,如何返回错误的没插入数据

MySQL 更新语句错误

pdo 中的 errorinfo 函数总是在 medoo lib 中返回 0000

用于在 JavaScript 中的二叉树中插入节点的递归函数中的错误

在MongoDB中插入上一个查询的结果将返回语法错误