在Visual Studio 2010中从C#访问Microsoft Access Database
对象的属性(如在CurrentDb.Properties
中)的最佳方法是什么?
(不重要:实际上我想按需“删除几十个数据库中的复制”。复制几年没有使用,MS Access也没关系2013年之前.Access 2013拒绝使用此功能的数据库。)
答案 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属性变成了)