【问题标题】:changing the sourcetable of a linked table in access 2007 with C#使用 C# 在 access 2007 中更改链接表的源表
【发布时间】:2014-05-22 08:56:32
【问题描述】:

我首先要问我在下图中的想法是否正确:

“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--调用失败”。

【问题讨论】:

  • (1) 是的,您是对的:工具提示中出现的TABLE= 名称不是.Connect 属性的一部分。它是.SourceTableName。 (2) 您确定tbd.Connect 是有效的.Connect 属性吗?当您在 Access 中打开数据库并双击相应的链接表时,它是否在数据表视图中正确打开? (3) 现有链接表是否将数据库密码保存为链接表定义的一部分?
  • 另外,对于它的价值,我刚刚测试了你的CreateTableDef 代码,它对我来说工作正常,链接表指向 SQL Server 2008 R2 和 MySQL 5.6 数据库。您使用什么数据库后端来运行测试?或许该 ODBC 驱动程序和/或其连接字符串有什么特别之处?
  • (2) 是的,这绝对是一个有效的 .Connect 声明。我可以在数据表模式下查看所有数据并设计心情等。 (3) 现有表确实有密码保存为表定义的一部分。由于显而易见的原因,默认访问不会在工具提示中显示此内容,但可以通过 Console.Writeline(tbd.Connect); 看到它。我对 CreateTableDef 表示歉意。我输入了错误的源表名。字符串中有一个下划线而不是句号。它正在工作。
  • 我实际上并不希望将新表称为“新表”。我需要将其称为“CLOASEUCDBA_T_BASIC_POLICY”。如果我尝试在第二种方法中执行此操作,我会得到一个已经存在的异常。理想情况下,我需要第一种工作方式。

标签: c# sql ms-access ms-access-2007 oledb


【解决方案1】:

由于我们不允许更改 TableDef 集合中已存在的 TableDef 对象的 SourceTableName,我们需要创建一个新的 TableDef 对象,.Delete 旧对象,然后.Append新人:

// 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多