目的是在更新应用程序和更新access数据库而不更改数据的情况下,因此只更新新表或新列,因此我希望将具有其结构的确切表复制到旧数据库vb.net和access数据库。
我尝试的是检测旧数据库和新数据库之间的差异,方法是在combobox1中获取唯一丢失的表,在combobox2中获取旧数据库中已在两个数据库中已经存在的准确表中的缺失列,并获取其数据类型。
因此,我希望复制整个表,然后只创建遗漏的列。
谢谢
发布于 2022-09-04 20:34:00
没有一个内置的工具可以做到这一点。但是,更糟糕的是,在Access中没有“生成”更改脚本(比如使用SQL server)。
那么,你如何处理这个问题呢?使用ms access作为数据库的一些会计系统或商业程序是什么?
好吧,你必须在你的软件中建立一种“高级”系统。
这意味着两件事:
要向表中添加一个新列(例如),您永远不要打开access数据库,而是使用“添加”或“编写”代码来添加该字段。
事实上,我已经在现场部署了一个掌声-许多台式机。
所以,我有一个叫做升级的代码模块。每次我需要一个新的字段或者其他什么的时候,我都会编写代码来添加那个新的colum。
只要我总是把东西添加到代码模块中,我就没事了。(不要违反添加新字段、表或甚至增加某个字段长度的规则?-使用代码)。
在我编写了一些代码之后,这变得非常容易。实际上,我通常会剪切+粘贴以前的代码,以便将新列添加到表中。
然而,大约5年后,这个杂乱的代码模块中包含了800+代码行!
但是,我也意识到,大多数事情像添加一个新的列或什么?一遍又一遍的相同代码。
所以,我接下来做的是构建了一个“升级”表。看起来是这样的:
Version action SQL RunCode
2.5 AddTable tblCustomers
2.5 AddField "sql here to add table"
等等
所以,我有一个版本号,然后我把它和上等表进行比较。我有"action",代码会简单地循环这个表,然后做任何事情。
因此,例如,要添加一个字段,可以使用access "DDL“命令(数据定义命令-大多数SQL系统都支持这一点,Access也是如此)。
所以,像这样说:
' any new table code goes here:
If lngVer < 1148 Then
' add event Invoice text option
ExecuteSQLNR "ALTER TABLE dbo.Events ADD InvoiceText ntext NULL"
ExecuteSQLNR "ALTER TABLE dbo.Events ADD HideEventDate bit NULL default 0"
或者,把一列长度从50增加到55。
db.Execute "ALTER TABLE tblGroupRemind ALTER COLUMN Anotes text(255)", dbFailOnError
如前所述,由于如此多的命令非常相似,所以我开始将这些信息放入表中,然后在循环中执行所需的升级。
换一张全新的桌子?嗯,我觉得代码太多了,所以我总是包含一个空白的空数据库,对于新的表,我会将它们放在那个upgrade.accDB表中,并将表从升级数据库“传输/复制”到真正的表中。这样,我可以非常容易地创建一个全新的表,并在Access设计器中创建,然后将该表添加/复制到"upgrade.accDB“数据库中。
如前所述?上面的想法和方法运作得相当好。
事实上,随着时间的推移,我发现在编写代码以添加新列的过程中,所遇到的麻烦更少了,或者任何需要打开ms-acces,然后打开表,然后由设计人员进行更改的东西。
不过,上面的大问题呢?
那么,您必须让所有用户至少升级到现有的模式,并且没有自动化的工具。
事实上,在我有任何自动化工具之前?我会打开便笺簿,如果我增加一些字段到某个桌子上?我只需简单地在便笺簿中键入这样和这样的表格中的新字段)。
然后,在客户网站上,我会打开他们的数据库,然后查看便笺簿文档,看看我要做的更改列表。(这就是我在开始自动化流程之前所做的事情--当然,“现场”或拥有客户数据库并不总是切实可行的。
但是,一旦我有了以上所有的工作?
然后,在开发期间,我会打开我的“升级”数据库,添加新的行和操作(新表、新列等)。
我甚至有一个列,它定义了在该命令之后运行的函数。我的意思是,当您添加新列或更改表中的某些内容时,通常需要复制数据,或者至少在进行更改后处理一些数据。
一旦你成功了?
然后,您就不会直接对数据表进行更改,而是使用您的“系统”。而且效果很好。
例如,客户可以打开一个较旧的数据文件,比如4或5年前的数据文件。将检测到应用程序版本号,然后升级代码将运行所有更新该数据库的版本。(我在启动时就自动完成了这个操作,所以他们根本不知道会发生这样的升级)。
所以,你只需要确保对你所做的每一个改变,你把这些代码放到你的升级系统中,你就完成了。
但是,对于现有的系统呢?您必须查看自上次部署以来所做的更改,并写出"ddl“命令( alter命令)。
没有自动化的方法来做到这一点。
作为FYI?
Visual中最好和更有价值的免费工具之一是SQL server比较实用程序。它不仅将自动检测和告知两个SQL服务器数据库之间的更改,而且还将为您升级。(非常好)
但是,这样的系统是不可访问的。实际上,这个用于SQL server的实用程序是非常有价值的,为此您可能会考虑从Access升级到SQL server。用那个功用?我可以在本地工作,向SQL数据库添加字段、列、表甚至存储过程。当我在现场(甚至通过VPN),然后我运行比较工具-它显示的变化,并有一个按钮来更新目标模式。
我不知道一个自动的“模式”检查器和访问更新器。
因此,我所建议的只有当您将这样的系统放在适当的位置,然后作为开发人员总是对升级系统进行模式更改,而不是直接在数据库中使用ms-access时,我的建议才能奏效。
https://stackoverflow.com/questions/73602196
复制相似问题