如何从C#程序修改MS Access数据库属性集合(而不是数据!)?

时间:2013-09-26 13:36:43

标签: c# ms-access ms-office

在Visual Studio 2010中从C#访问Microsoft Access Database对象的属性(如在CurrentDb.Properties中)的最佳方法是什么?

(不重要:实际上我想按需“删除几十个数据库中的复制”。复制几年没有使用,MS Access也没关系2013年之前.Access 2013拒绝使用此功能的数据库。)

1 个答案:

答案 0 :(得分:2)

您可以使用Access DAO object library迭代并修改Access数据库中的属性。

以下代码遍历数据库中的属性以及不同容器及其属性以及Databases容器中的Documents及其属性。输出将写入Debug Output窗口。

之后,我从不同的属性集合中选择一个Property并更改它的值。请注意,如果属性不存在,使用集合上的索引器将抛出异常。

确保您引用了 Microsoft Office 12.0 Access数据库引擎对象库的主Interop程序集(您的版本迁移程度各不相同),以便您可以在using语句中使用以下内容:

using Microsoft.Office.Interop.Access.Dao;

你的方法会是这样的:

    // Open a database
    var dbe = new DBEngine();
    var db = dbe.OpenDatabase(@"C:\full\path\to\your\db\scratch.accdb");
    // Show database properties
    DumpProperties(db.Properties);
    // show all containers
    foreach (Container c in db.Containers)
    {
        Debug.WriteLine("{0}:{1}", c.Name, c.Owner);
        DumpProperties(c.Properties);
    }
    //Show documents and properties for a specific container
    foreach (Document d in db.Containers["Databases"].Documents)
    {
        Debug.WriteLine("--------- " + d.Name);
        DumpProperties(d.Properties);
    }

    // set a property on the Database
    Property prop = db.
        Properties["NavPane Width"];

    prop.Value = 300;

    // set a property on the UserDefined document
    Property userdefProp = db
        .Containers["Databases"]
        .Documents["UserDefined"]
        .Properties["ReplicateProject"];

    userdefProp.Value = true;

物业转储商助手

private static void DumpProperties(Properties props)
{
    foreach (Property p in props)
    {
        object val = null;
        try
        {
            val = (object)p.Value;
        }
        catch (Exception e)
        {
            val = e.Message;
        }
        Debug.WriteLine(
            "{0} ({2}) = {1}", 
            p.Name, 
            val, 
            (DataTypeEnum) p.Type);
    }
}

我使用this来克服在动态类型上抛出的异常(因为Value属性变成了)