こんばんは、水戸スヤです。
今日はMS Accessを使用する場合に、
DDL(Create、Alter、Dropなどのテーブル構造の変更命令)をした場合に、
ロールバックできるかの検証をします。
Oracleの場合は、DDLやTRUNCATEの命令はロールバックできません。
よって構造の変更をプログラムで行うのはリスキーと言えるでしょう。
ではMS Accessの場合はどうでしょう。
ググッた感じだとPostgreSQLやMySQLはいけるっぽいですね。
Accessはヒットしないので、検証してみます。
まず下記のようなテーブル構成のAccessファイルを用意します。
上記のファイルに対して、OleDb経由で接続し、
を実行してみます。
まずちゃんと動いてることの確認。
/// <summary>
/// Create Alter Drop などでRollbackが効くのか検証
/// </summary>
public void DDLRollbackTest()
{
    using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\file\example.accdb"))
    {
        con.Open();
        using (OleDbCommand cmd = new OleDbCommand())
        {
            OleDbTransaction tran = con.BeginTransaction();
            try
            {
                cmd.Transaction = tran;
                cmd.Connection = con;
                // Drop Table
                cmd.CommandText = "DROP TABLE TABLE1";
                cmd.ExecuteNonQuery();
                // Alter Table
                cmd.CommandText = "ALTER TABLE TABLE2 ADD COLUMN1 DATE";
                cmd.ExecuteNonQuery();
                // Create Table
                cmd.CommandText = "CREATE TABLE TABLE3 (COLUMN1 DATE)";
                cmd.ExecuteNonQuery();
                //tran.Rollback();
                tran.Commit();
            }
            catch
            {
                tran.Rollback();
                throw;
            }
            finally
            {
                if (con != null)
                {
                    con.Close();
                }
            }
        }
    }
}
一回目は例外なく動くことを確認したいので、
//tran.Rollback();
としています。
では実行してみましょう。
ファイルを開いてみると、
が確認できると思います。
では本題。
先ほどのソースのCommitを止め、Rollbackに変更します。
//tran.Rollback(); tran.Commit();
↓
tran.Rollback();
そして実行。
が確認できました。
ちゃんとロールバックされていましたね。
MS AccessもDDLの操作がロールバックできるようですね。
参考までに。