首先,我要问我是否正确,如下图所示:
‘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();