2017-07-27 60 views
0

我从外部.Net应用程序连接到MS Access数据库。我需要使用SQL来升级数据库的模式。部分升级需要重命名属于一对多关系的表。如何使用SQL将关系重命名为MS Access表?

据我所知,不可能使用SQL在MS Access中实际重命名表。我的研究使我得到以下解决方案。

SELECT * INTO OldTableName FROM NewTableName 
DROP TABLE OldTableName 

对于不属于关系部分的表,这似乎可以正常工作。但是,如果表属于关系,那么在运行DROP TABLE SQL时会收到以下异常。

Cannot delete this index or table. It is either the current index or is used in a relationship. 

是否有通过SQL的方式,我可以更新MS Access中的关系指向已创建这样的旧表可以删除新表?

+0

你需要删除表之前,删除旧的外键约束,然后创建新的 –

+0

OK,但你能不能细说了?也许有一些SQL,这是我想弄明白。 – user1227445

回答

1

您可以通过简单地使用Access DAO重命名表可能保存自己有些悲伤:

using Microsoft.Office.Interop.Access.Dao; 

namespace AccessDaoConsoleApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var dbe = new DBEngine(); 
      Database db = dbe.OpenDatabase(@"C:\Users\Public\Database1.accdb"); 
      TableDef tbd = db.TableDefs["OldTableName"]; 
      tbd.Name = "NewTableName"; 
      db.Close(); 
     } 
    } 
} 

的.NET项目将需要访问DAO COM引用。我使用的是

的Microsoft Office 14.0 Access数据库引擎对象库

+0

这将需要最终用户的计算机安装Office,但正确吗? – user1227445

+0

@ user1227445 - 不,Access DAO是Access数据库引擎的一部分。如果他们可以执行Access OLEDB/ODBC,那么他们也可以执行Access DAO。 –

+0

但是从哪里来?最终用户必须安装Access,那么对不对? – user1227445

0

你应该先删除外键约束。如何使用SQL可以看到例如here。然后创建新的约束:

alter table City 
    add constraint FK_City_REF_States foreign key (ID_State) 
     references States (ID_State); 
+0

我刚刚发现了这个帖子,并尝试完全按照你所说的去做。问题是,当我试图删除约束时,我得到一个错误,告诉我我没有权限从Msysrelationships中读取,所以基本上杀死了这个想法。不确定为什么它被接受为这个问题的答案,如果你不能真正从该表读取。 – user1227445

+0

从Access外部读取此表的方法很少,您可以搜索此内容。但实际上,如果数据库在您的控制之下并且不会动态更改,您实际上不需要从外部读取此表。只需打开accdb一个Access,读取一次约束名称并在.net代码中使用它们 –