0

晚上好,

我正在使用以下代码截断 MySQL 数据库中的表。据我所知,查询运行良好,表被截断。但是,我用来测试行是否受到影响的 if 语句正在 Else 语句上进行评估。

那么为什么数据库中的表被截断 - 正如预期的那样 - 但 Else 语句正在被评估 - 好像没有行受到影响?我究竟做错了什么?

这是代码:

    Public Sub purgeCC()
    Dim dbAdapter As New MySqlDataAdapter
    Dim dbCmd As New MySqlCommand


    Dim ConnectionString As String = String.Format("Server={0};Port={1};Uid={2};Password={3};Database=accounting", FormLogin.ComboBoxServerIP.SelectedItem, My.Settings.DB_Port, My.Settings.DB_UserID, My.Settings.DB_Password)
    Dim myQuery As String = "TRUNCATE TABLE cc_master"

    Using dbConn As New MySqlConnection(ConnectionString)
        Using dbComm As New MySqlCommand()
            With dbComm
                .Connection = dbConn
                .CommandType = CommandType.Text
                .CommandText = myQuery
            End With

            Try
                Dim affectedRow As Integer
                dbConn.Open()
                affectedRow = dbComm.ExecuteNonQuery()
                If affectedRow > 0 Then
                    MsgBox("Credit Card Master table has been successfully purged!", MsgBoxStyle.Information, "DATABASE PURGED!")
                Else
                    MsgBox("Credit Card Master table was not purged!", MsgBoxStyle.Critical, "ATTENTION")
                End If
            Catch ex As Exception
                MessageBox.Show("A DATABASE ERROR HAS OCCURED" & vbCrLf & vbCrLf & ex.Message & vbCrLf & _
                                    vbCrLf + "Please report this to the IT/Systems Helpdesk at Ext 131.")
            End Try
            dbConn.Close()
            dbComm.Dispose()
        End Using
    End Using
End Sub
4

2 回答 2

5

根据本文档http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html 如果数据库版本大于 5.somthing 并且表确实,truncate 命令可能并不总是返回受影响的行没有外键约束。如果您确实有 FK,则为每一行处理一个删除,并获得您正在寻找的返回值,但如果您没有,那么 mysql 将删除并重新添加表(这要快得多),这意味着它有不知道有多少记录受到影响。

于 2012-11-03T03:17:17.047 回答
2

您的if陈述正在被正确评估,只是affectedRow(可能应该是affectedRows顺便说一句,但我只是在那里迂腐)没有按照您的预期设置。

根据. _truncate table _

在某些情况下,它只有在映射到 a 时才是准确的delete(例如具有外键约束的 InnoDB 引擎的特定版本,因为它们必须被检查或级联)。

对于其他引擎,您可能会得到 0,因为它会删除表然后重新创建它。

如果您真的想要该信息,请select count(*)在截断之前和之后执行。当然,after通常应该为零(除非截断失败)。

于 2012-11-03T03:24:55.263 回答