使用C#更改Access 2007中链接表的源表

首先,我要问我是否正确,如下图所示:

‘TABLE = CLOASEUCDBA.T_BASIC_POLICY’不是连接字符串的一部分吗?其实它是源表的名字吗?

我想将其更改为同一数据库上的另一个链接表.连接字符串应该相同,并且在ACCESS中显示的名称应该相同.唯一的区别应该是实际上是在引用另一个表,实际上,如果您打开该表,它将包含不同的字段和数据.

我到目前为止的代码是:

    var dbe = new DBEngine();
    Database db = dbe.OpenDatabase(@"C:\Users\xxxx\Documents\Test.accdb");
    foreach (TableDef tbd in db.TableDefs)
    {

        if (tbd.Name.Contains("CLOASEUCDBA_T_BASIC_POLICY"))
        {
            tbd.SourceTableName = "CLOASEUCDBA_T_BILLING_INFORMATION"; 
        }
    }
    db.Close();

但是,我遇到了一个很大的麻烦COMException“对象一旦成为集合的一部分,就无法设置此属性.”我不确定为什么,我在网上可以找到的所有示例都是用VB / VBA编写的,而我对此的了解非常有限.任何帮助表示赞赏.

编辑:
我尝试使用以下代码走另一条路,但没有成功:

        if (tbd.Name.Contains("CLOASEUCDBA_T_BASIC_POLICY"))
        {
            var newtable = db.CreateTableDef("this is a new table");
            newtable.Name = "new table";
            newtable.Connect = tbd.Connect;
            newtable.SourceTableName = "CLOASEUCDBA_T_BILLING_INFORMATION";
            db.TableDefs.Append(newtable);
            //tbd.SourceTableName = "CLOASEUCDBA_T_BILLING_INFORMATION"; 
        }

在这种情况下,我得到错误“ ODBC–调用失败”.

解决方法:

由于我们不允许更改TableDefs集合中已存在的TableDef对象的SourceTableName,因此需要创建一个新的TableDef对象,先删除旧对象,然后再追加新对象:

// This code requires the following COM reference in your project:
//
//     Microsoft Office 14.0 Access Database Engine Object Library
//
// and the declaration
//
//     using Microsoft.Office.Interop.Access.Dao;
//
// at the top of the class file            

string tableDefName = "CLOASEUCDBA_T_BASIC_POLICY";
var dbe = new DBEngine();
Database db = dbe.OpenDatabase(@"C:\Users\xxxx\Documents\Test.accdb");
var tbdOld = db.TableDefs[tableDefName];
var tbdNew = db.CreateTableDef(tableDefName);
tbdNew.Connect = tbdOld.Connect;
tbdNew.SourceTableName = "CLOASEUCDBA_T_BILLING_INFORMATION";
db.TableDefs.Delete(tableDefName);  // remove the old TableDef ...
db.TableDefs.Append(tbdNew);        // ... and append the new one
db.Close();
上一篇:OleDB读取Excel时出现空数据的解决方法


下一篇:使用C#中的if语句通过UPDATE更新特定的行(sql)