最近、Access db(ダウンストリームパートナーの要件)を作成し、すべてのメモ列を含むテーブルを追加してから、動作を停止した一連のレコードを挿入するプログラム。奇妙なことに、私が見ることができる環境の変化はなく、それに影響を与える可能性のある差分もありませんでした。さらに、これは、Officeがあるかどうかに関係なく、またOfficeがある場合は32ビットか64ビットかを問わず、私が試したすべてのマシンで再現されます。
問題は、プログラムの実行後にデータベースを開くと、宛先テーブルが空になり、代わりに一連の行を含むMSysCompactErrorテーブルが存在することです。
蒸留されたコードは次のとおりです。
var connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=corrupt.mdb;Jet OLEDB:Engine Type=5";
// create the db and make a table
var cat = new ADOX.Catalog();
try
{
cat.Create(connectionString);
var tbl = new ADOX.Table();
try
{
tbl.Name = "tbl";
tbl.Columns.Append("a", ADOX.DataTypeEnum.adLongVarWChar);
cat.Tables.Append(tbl);
}
finally
{
Marshal.ReleaseComObject(tbl);
}
}
finally
{
cat.ActiveConnection.Close();
Marshal.ReleaseComObject(cat);
}
using (var connection = new OleDbConnection(connectionString))
{
connection.Open();
// insert a value
using (var cmd = new OleDbCommand("INSERT INTO [tbl] VALUES ( 'x' )", connection))
cmd.ExecuteNonQuery();
}
これが私が遭遇したいくつかの回避策です:
- テーブルの作成と値の挿入の間にブレークポイントを挿入し(上記の28行目)、Accessでmdbを開いて再度閉じると、アプリが続行してもデータベースが破損することはありません。
- エンジンタイプを5から4に変更すると(1行目)、破損していないmdbが作成されます。最終的には廃止されたmdbバージョンになりますが、テーブルには値があり、MSysCompactErrorはありません。この方法でデータベースを作成し、最後にプログラムで5にアップグレードしようとしましたが、運が悪かったことに注意してください。最新バージョンではdbが破損してしまいます。
adLongVarWChar
13行目をに変更してメモフィールドからテキストフィールドに変更したadVarWChar
場合、データベースは破損していません。ただし、最終的text
には、ではなくデータベースにフィールドが表示されmemo
ます。
最後の注意:私の旅行では、MSysCompactErrorがデータベースの圧縮に関連していることを確認しましたが、データベースを圧縮するために明示的なことは何もしていません。
何か案は?