65.9K
CodeProject 正在变化。 阅读更多。
Home

数据库比较器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (17投票s)

2008 年 12 月 29 日

CPOL

3分钟阅读

viewsIcon

83468

downloadIcon

2749

使用此工具,您可以比较两个数据库并生成差异报告。

介绍 

现在,Microsoft SQL Server是世界上最流行的DBMS之一,大多数公司和软件工程师都将其用作数据库。 在程序的开发和维护过程中,不清楚数据库是否已更改。 例如,当您在客户的站点上安装您的程序时,一段时间后,如果您想升级此软件/数据库,您必须拥有更重要的数据,因为如果您无法正确升级数据库,那么您的程序将无法正常工作。 为了解决这个问题,我认为如果有一种工具可以将主数据库(在开发人员的站点上)与从数据库(在客户的站点上)进行比较,并找出它们之间的差异,它可以帮助我们正确地维护程序。

设计

对于此工具的设计和实现,我使用了C#.NET,并将我的工具指定为Microsoft SQL Server 2000。我的程序的用户界面有2个部分

  1. 主部分 
  2. 从属部分

在主部分中,程序从开发人员端的主站点检索信息,而在从属部分中,它从客户站点检索信息。 从数据库中检索的信息涉及表列表,表名,列名,列类型等。对于检索表列表的第一步,在SQL Server 2000中,有关表和视图的所有信息都存储在名称为“sysobjects”的表中。 为了从此表中检索信息,我使用了如下查询

SELECT     name AS TableName, id FROM         dbo.sysobjects WHERE     (xtype = 'u')

在获得两个数据库中的表列表之后,现在我可以比较表列表并找出哪个表是新表。 主列表中存在但从属列表中不存在的每个表都是新表。 但是对于比较两个数据库,这还不够,因为可能某些表的列已更改,并且通过这种方法,我们无法找到这些更改。 为了完成我的方法,我必须逐个比较每个表并检索每个表的信息。 为了检索表的信息,我使用了如下查询

SELECT     dbo.syscolumns.id, dbo.syscolumns.name AS Col, dbo.systypes.name AS TypeName,
dbo.sysobjects.name AS TableName, dbo.syscolumns.length AS Len FROM         dbo.syscolumn
s INNER JOIN dbo.systypes ON dbo.syscolumns.xtype = dbo.systypes.xusertype INNER JOIN dbo
.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id WHERE     (dbo.sysobjects.xtype = 'u
') AND dbo.sysobjects.name like  [TABLENAME] 

在检索诸如列名,列类型和列大小之类的信息之后,现在我可以比较并找到更好的结果。

用户界面

为了使用我的程序,在我的程序的左侧,您可以看到主部分,而在右侧,您可以看到从属部分。 对于每个部分,您都必须键入服务器名称,用户ID和密码才能连接。 连接到数据库后,您现在只需单击“比较!”即可。 

为了更好地进行虚拟比较,我对每个数据库都使用一个树。 在树的第一层,您可以看到表列表,并且通过展开每个节点,您可以看到其信息,例如列名,列类型等。

SQL1.JPG

SQL2.JPG

在此版本的程序中,该软件仅显示差异,但对于未来的工作,我想使用此信息软件生成SQL脚本文件,该文件可以保存到文件中,客户可以执行该文件来升级他/她的数据库。

下一个版本(1.1) 

在此版本中,您可以将数据库的架构保存到文件中(* .schema)
以后您可以离线获取数据库的架构。
在下一张图片中,您可以看到您所期望的一切

SQL3.JPG

未来工作 

将来,这可能会生成SQL报告。  

历史 

  • 2008年12月29日:初始发布 
  • 2009年1月8日:发布版本1.1
© . All rights reserved.