こんばんは、水戸スヤです。
今日は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の操作がロールバックできるようですね。
参考までに。