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

用于插入/更新MySql数据库的函数返回错误“;“受影响的行”;数,mysql,vb.net,Mysql,Vb.net,我正在使用下面的代码使用DataTable 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

我正在使用下面的代码使用
DataTable

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
like赋值 “数据源=“+Server_Name+”;用户名=“+UserDB+”;密码=” +密码+“数据库=”+数据库名称+“”

3) 创建一个具有类似DB表字段的列名的
DataTable

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

来自微软

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

因此,要么重复计算受影响的行,要么实际上更新了2行。

来自Microsoft

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

所以,要么重复计算受影响的行,要么实际更新2行

在重复密钥更新时,如果发生以下情况,则每行受影响的行值为1 该行将作为新行插入,如果更新了现有行,则为2,并且 如果现有行设置为其当前值,则为0

在重复密钥更新时,如果发生以下情况,则每行受影响的行值为1 该行将作为新行插入,如果更新了现有行,则为2,并且 如果现有行设置为其当前值,则为0


我没有任何触发器,似乎只有更新时才会返回错误的号码我没有任何触发器,似乎只有更新时才会返回错误的号码。那么,你能显示你的更新代码吗?@Steve你是什么意思?为了更新,我使用传递数据表的函数。这是我的密码。当一行存在时,它将被更新对不起,错过了“重复密钥更新”的答案,请参阅下面MySQL文档中的答案。那么你能显示你的更新代码吗?@Steve你是什么意思?为了更新,我使用传递数据表的函数。这是我的密码。当一行存在时,它将被更新抱歉,错过了“重复密钥更新”的答案,请参阅下面MySQL文档中的答案。因此,我永远无法知道受影响行的有效数量!如果返回4,则有可能更新了两行,或者插入了4行,或者更新了一行,插入了两行?有没有办法获取详细信息?当然,不要使用该函数,而是编写update或insert sql语句。这将得到正确的数字。因此,我永远无法知道受影响行的有效数量!如果返回4,则有可能更新了两行,或者插入了4行,或者更新了一行,插入了两行?有没有办法获取详细信息?当然,不要使用该函数,而是编写update或insert sql语句。这样你就能找到正确的号码了。