0

我是新来的。事实上,这是我第一次在 stackoverflow 上发布问题。我做了很多搜索,但找不到答案。这是我正在尝试做的事情的要点。

  1. 使用 ADOX 打开一个访问数据库文件。
  2. 对于数据库中的所有非隐藏和非系统表,在“验证文本”属性中添加一个条目。
  3. 关闭访问数据库文件。

这是文件发生的情况。

  1. 锁定文件 *.ldb 存在于文件夹中,这会触发数据库被另一个进程打开的错误。

这是我徒劳的尝试。

  1. 关闭在 foreach 循环的每次迭代中打开的表。
  2. 在 foreach 循环之后立即关闭目录类和对象。
  3. 删除 foreach 循环内的所有代码。

这是我打算做的。

  1. 使用 Try Catch 来捕获错误。

        cn = new ADODB.Connection();
        cat = new ADOX.CatalogClass();
        cn.Open(tmpStr);
        cat.ActiveConnection = cn;
    
        //Loop through all tables to add the validation text
        foreach (Table t in cat.Tables)
        {
    
    
            tname = t.Name;
            ttype = t.Type == null ? string.Empty : t.Type;
            tprop = t.Properties["Jet OLEDB:Table Hidden In Access"].Value.ToString();
            if (ttype.ToUpper() == "TABLE" && tprop.ToUpper() == "FALSE") // 
            {
                t.Properties["Jet OLEDB:Table Validation Text"].Value = "this is table " + tname + "                                                                                                student1";
            }
    
            //System.Runtime.InteropServices.Marshal.FinalReleaseComObject(t);
    
        }
        //Close all open objects
    
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat.Tables);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat.ActiveConnection);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(cat);
        GC.Collect();
    

你认为我试图完成我想做的事情的方式有问题吗?谢谢你,祝你有美好的一天。

4

1 回答 1

1

我有很长时间没有使用 ADODB,但据我记得:你应该关闭连接,GC.Collect() 将“最终”收集孤儿对象,但我相信你应该使用 Connection 对象的 Close 方法。 https://msdn.microsoft.com/en-us/library/ms807027.aspx

于 2017-03-09T20:56:16.563 回答