2012-11-07 123 views
2

最近,一個創建Access數據庫(我們的下游合作伙伴的要求)的程序添加了一個包含所有備註欄的表,然後插入一堆停止工作的記錄。奇怪的是,我所看到的環境沒有任何變化,也沒有任何可能影響它的差異。此外,我試過的任何機器上的這個repros,無論是否有Office,以及是否有Office,無論是32位還是64位。插入值時破壞Access數據庫

問題是,當程序運行後打開數據庫時,目標表是空的,而是有一行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。最終版本中會出現損壞的數據庫。
  3. 如果通過將第13行中的adLongVarWChar更改爲adVarWChar,從備註更改爲文本字段,則數據庫不會損壞。不過,您最終會在數據庫中使用text字段,而不是memo

最後一點:在我的旅行中,我已經看到MSysCompactError與壓縮數據庫有關,但我沒有做任何明確的操作來使db變得緊湊。

任何想法?

+0

您可以從具有表結構但表中沒有數據的MDB開始,製作該MDB的副本,並將其插入副本嗎? – HansUp

+0

這正是我最終做的。根據MS支持,不建議使用編程方式創建Jet數據庫。有關更多信息,請參閱http://support.microsoft.com/kb/318559。 – Jon

回答

0

正如我回答HasUp: 根據MS支持,不贊成使用編程方式創建Jet數據庫。我最終檢查了一個空模型數據庫,然後在需要一個新數據庫時複製它。有關更多信息,請參閱http://support.microsoft.com/kb/318559