2

最近、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();
}

これが私が遭遇したいくつかの回避策です:

  1. テーブルの作成と値の挿入の間にブレークポイントを挿入し(上記の28行目)、Accessでmdbを開いて再度閉じると、アプリが続行してもデータベースが破損することはありません。
  2. エンジンタイプを5から4に変更すると(1行目)、破損していないmdbが作成されます。最終的には廃止されたmdbバージョンになりますが、テーブルには値があり、MSysCompactErrorはありません。この方法でデータベースを作成し、最後にプログラムで5にアップグレードしようとしましたが、運が悪かったことに注意してください。最新バージョンではdbが破損してしまいます。
  3. adLongVarWChar13行目をに変更してメモフィールドからテキストフィールドに変更したadVarWChar場合、データベースは破損していません。ただし、最終的textには、ではなくデータベースにフィールドが表示されmemoます。

最後の注意:私の旅行では、MSysCompactErrorがデータベースの圧縮に関連していることを確認しましたが、データベースを圧縮するために明示的なことは何もしていません。

何か案は?

4

1 に答える 1

0

私が HasUp に返信したように: MS サポートによると、プログラムによる Jet データベースの作成は非推奨です。結局、空のモデル データベースをチェックインし、新しいデータベースが必要になるたびにそれをコピーしました。詳細については、 http://support.microsoft.com/kb/318559を参照してください。

于 2012-11-12T21:48:14.117 に答える