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 によると、DB バージョンが 5.somthing より大きく、テーブルが外部キー制約がありません。FK がある場合は、行ごとに削除が処理され、探している戻り値が得られますが、そうでない場合、mysql はテーブルを削除して再追加します (これははるかに高速です)。影響を受けたレコードの数はわかりません。

于 2012-11-03T03:17:17.047 に答える
2

あなたのifステートメント正しく評価されています.それはあなたが期待するように設定されていないだけですaffectedRow.affectedRows

のオンライン ドキュメントのように、切り捨ての影響を受ける行数に依存するのは賢明ではありませんtruncate table

delete場合によっては、 (チェックまたはカスケードする必要があるため、外部キー制約がある InnoDB エンジンを使用する特定のバージョンなど)にマップされる場合にのみ正確です。

他のエンジンでは、テーブルを削除してから再作成するため、0 になる場合があります。

本当に情報が必要な場合はselect count(*)、切り捨ての前後に実行してください。もちろん、通常はゼロにするafter必要があります(切り捨てが失敗しない限り)。

于 2012-11-03T03:24:55.263 に答える