为什么我的if语句没有被正确评估?

时间:2012-11-03 03:11:05

标签: mysql vb.net

晚上好,

我正在使用以下代码截断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

2 个答案:

答案 0 :(得分:5)

根据此文件http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html 如果DB版本大于5.somthing并且表没有外键约束,则truncate命令可能无法始终返回受影响的行。如果你确实有FK,那么每行都会处理一个删除,你会得到你想要的返回值,但是如果你不这样做,那么mysql会丢弃并重新添加表(这要快得多),这意味着它没有想法有多少记录受到影响。

答案 1 :(得分:2)

您的if语句正在正确评估,它只是affectedRow(顺便说一句应该是affectedRows,但我只是迂腐)没有像你期望的那样设定。

根据truncate table的{​​{3}},依赖受影响的行数进行截断是不明智的。

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

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

如果您确实需要这些信息,请在截断前后执行select count(*)。当然,after通常应为零(除非截断失败)。