插入值时损坏Access数据库

时间:2012-11-07 19:15:37

标签: oledb ms-access-2010 adox

最近,一个创建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();
}

以下是我偶然发现的一些解决方法:

  1. 如果在创建表和插入值之间插入断点(上面的第28行),并使用Access打开mdb并再次关闭它,那么当应用程序继续时它不会破坏数据库。
  2. 将引擎类型从5更改为4(第1行)将创建未损坏的mdb。您最终得到了一个过时的mdb版本,但该表有值,并且没有MSysCompactError。请注意,我尝试以这种方式创建数据库,然后以编程方式将其升级到5,没有运气。我最终在最新版本中使用了损坏的数据库。
  3. 如果您通过将第13行的adLongVarWChar更改为adVarWChar,从备忘录更改为文本字段,则数据库不会损坏。不过,您最终会在数据库中使用text字段,而不是memo
  4. 最后一点:在我的旅行中,我已经看到MSysCompactError与压缩数据库有关,但我没有做任何明确的事情来使数据库紧凑。

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

当我回复HasUp时: 根据MS支持,不建议以编程方式创建Jet数据库。我最终检查了一个空模型数据库,然后每当我需要一个新数据库时复制它。有关详细信息,请参阅http://support.microsoft.com/kb/318559