1

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

(不是必需的:事实上,我想“按需”在几十个数据库中摆脱复制。复制已经有几年不用了,对于 2013 年之前的 MS Access 来说还可以。Access 2013 拒绝使用这个的数据库特征。)

4

1 回答 1

2

您可以使用Access DAO 对象库来迭代和修改 Access 数据库中的属性。

以下代码迭代数据库中的属性以及不同的容器及其属性以及数据库容器中的文档及其属性。输出被写入调试输出窗口。

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

确保您引用了Microsoft Office 12.0 Access 数据库引擎对象库的主互操作程序集(您的版本可能会有所不同),以便您可以在 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);
    }
}

我用来克服在动态类型上引发的异常(正如 Value 属性所证明的那样)

于 2014-06-27T10:54:37.557 回答