最近,一个创建Access数据库(我们的下游合作伙伴的要求)的程序,添加了一个包含所有备注列的表,然后插入一堆停止工作的记录。奇怪的是,我所能看到的环境没有任何变化,也没有任何可能影响它的差异。此外,我尝试过的任何一台机器上的这种重复,无论是否有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();
}
以下是我偶然发现的一些解决方法:
adLongVarWChar
更改为adVarWChar
,从备忘录更改为文本字段,则数据库不会损坏。不过,您最终会在数据库中使用text
字段,而不是memo
。最后一点:在我的旅行中,我已经看到MSysCompactError与压缩数据库有关,但我没有做任何明确的事情来使数据库紧凑。
有什么想法吗?
答案 0 :(得分:0)
当我回复HasUp时: 根据MS支持,不建议以编程方式创建Jet数据库。我最终检查了一个空模型数据库,然后每当我需要一个新数据库时复制它。有关详细信息,请参阅http://support.microsoft.com/kb/318559。