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();
}
這裏有幾個解決方法,我偶然到:如果您插入創建表並插入值之間的斷點
- (第28行上面),然後用Access打開mdb並關閉它,然後當應用程序繼續時它不會損壞數據庫。
- 將引擎類型從5更改爲4(第1行)將創建一個未損壞的mdb。您最終得到一個過時的mdb版本,但該表具有值,並且沒有MSysCompactError。請注意,我試過用這種方式創建一個數據庫,然後在沒有運氣的情況下以編程方式將其升級到5。最終版本中會出現損壞的數據庫。
- 如果通過將第13行中的
adLongVarWChar
更改爲adVarWChar
,從備註更改爲文本字段,則數據庫不會損壞。不過,您最終會在數據庫中使用text
字段,而不是memo
。
最後一點:在我的旅行中,我已經看到MSysCompactError與壓縮數據庫有關,但我沒有做任何明確的操作來使db變得緊湊。
任何想法?
您可以從具有表結構但表中沒有數據的MDB開始,製作該MDB的副本,並將其插入副本嗎? – HansUp
這正是我最終做的。根據MS支持,不建議使用編程方式創建Jet數據庫。有關更多信息,請參閱http://support.microsoft.com/kb/318559。 – Jon