转:说说“数据库的自动安装、升级”
来源:互联网 发布:mac webpack打包 编辑:程序博客网 时间:2024/05/02 01:34
转:http://blog.joycode.com/jasper/archive/2007/01/29/92780.aspx
数据库的自动安装、升级是一个非常实用的功能,在初次安装软件,升级软件的时候可以节省大量的时间和无趣的工作,而且也节省了给用户写数据库升级指导的说明。
要实现数据库的自动安装、升级,其实并不难。我们在肥猫博客中,提供了这样的功能。每次程序升级,自己用起来都觉得非常地爽,不用繁琐的指导用户,也不用无趣的操作。那么在这里我们就介绍下如何像肥猫博客一样在asp.net中提供这样的功能。
首先,我们要对sql语句非常熟悉,数据库的自动安装和升级都是基于sql脚本的,准备好脚本文件是必须的。
一般来讲,会存在多个脚本文件:
1. 第一次安装所需要的脚本文件
2. 每一次升级所需要的脚本文件。这个升级脚本文件只需要提供从上一版本升级过来所需要的Sql语句就可以,其他的都不需要。
建立一份版本历史文件,这一般可以是一个xml文件,类似如下:
<?xmlversion="1.0"encoding="utf-8"?>
<sqlscripts>
<sqlscriptdbversion="1.1"dspt="V1.0到V1.10的升级包:增加了皮肤的数据"filename="v1_1.sql"/>
<sqlscriptdbversion="1.11"dspt="V1.10到V1.11的升级包:增加了订阅中最新文章的处理"filename="v1_11.sql"/>
<sqlscriptdbversion="1.2"dspt="V1.11到V1.20的升级包:增加了垃圾信息、IP管理"filename="v1_2.sql"/>
<sqlscriptdbversion="1.3"dspt="V1.20到V1.30的升级包:增加了流量统计分析"filename="v1_3.sql"/>
<sqlscriptdbversion="1.4"dspt="V1.30到V1.40的升级包:增加了我读,我看"filename="v1_4.sql"/>
</sqlscripts>
dbversion指的是数据库的版本号,dspt是对应的说明,filename就是上面提到的Sql脚本文件了。我们每次升级程序中的功能时,如果有数据库的升级,都应该增加对应的数据和Sql脚本文件。
另外还要做的准备工作是,要在程序中记录当前程序的版本codeversion,在数据库中记录当前数据库的版本dbversion。需要升级哪些sql脚本,是通过比较这两个版本值决定的。也就是根据codeversion和dbversion的值来确定我们应该执行上面列出的哪些脚本文件。
上面说的都是一些准备工作,下面我们可以开始具体的数据库自动安装、升级的程序开发了。
1. 提供类似如下的界面,告诉用户当前的版本,以及将会进行哪些升级工作。
private void ShowVersion()
{
// 显示当前的程序版本号、数据库版本号
double dbversion = fmPage.Provider.GetDatabaseVersion();
LabelCodeVersion.Text = fmUtility.CodeVersion.ToString("F2");
LabelDbVersion.Text = dbversion.ToString("F2");
XmlDocument doc = new XmlDocument();
// 读取版本历史文件
string filepath = HttpContext.Current.Request.MapPath("/admin/setup/history.xml");
doc.Load(filepath);
TextScripts.Text = string.Empty;
foreach(XmlNode node in doc.DocumentElement.ChildNodes)
{
double nodeversion = double.Parse(node.Attributes["dbversion"].Value);
// 比较数据库版本和程序版本,找出需要更新的列表
if(nodeversion > dbversion && nodeversion <= fmUtility.CodeVersion)
{
TextScripts.Text += "版本号: " + nodeversion.ToString("F2") + "/n";
TextScripts.Text += " " + node.Attributes["dspt"].Value + "/n/n";
}
}
BtnSubmit.Enabled = TextScripts.Text!=string.Empty;
}
2. 执行需要更新的sql脚本
public override void InstallDatabase()
{
double dbversion = GetDatabaseVersion();
XmlDocument doc = new XmlDocument();
string filepath = HttpContext.Current.Request.MapPath("/admin/setup/history.xml");
doc.Load(filepath);
// 使用事务,如果更新不成功则可以回退
OleDbTransaction transaction = connection.BeginTransaction();
try
{
foreach(XmlNode node in doc.DocumentElement.ChildNodes)
{
double nodeversion = double.Parse(node.Attributes["dbversion"].Value);
if(nodeversion > dbversion && nodeversion <= fmUtility.CodeVersion)
{
// 执行更新对应的sql脚本文件
InstallSqlScript(transaction, node.Attributes["filename"].Value);
}
}
transaction.Commit();
}
catch(Exception e1)
{
transaction.Rollback();
throw e1;
}
DataCache.RemoveAll();
}
执行sql脚本文件的代码:
private void InstallSqlScript(OleDbTransaction transaction, string filename)
{
string sql = string.Empty;
using (StreamReader sr = new StreamReader(HttpContext.Current.Request.MapPath("/admin/setup/sqlscripts/access/" + filename)))
{
string line;
while ((line = sr.ReadLine()) != null)
{
// 每当遇到GO标记,则执行该语句
if(line.ToUpper().StartsWith("GO"))
{
AccessHelper.ExecuteNonQuery(transaction, CommandType.Text, sql);
sql = string.Empty;
}
else
{
sql += line + "/n";
}
}
}
}
就这样,数据库的自动安装、升级代码就完成了。这里比较重要的就是脚本文件了,脚本文件应该要包含所有对数据库的更新内容,否则是达不到预期效果的。
除了以上讲的数据库安装/升级的核心代码外,你可能还需要对该功能进行权限控制。由于我们在肥猫博客中,只有管理员才能够升级,所以没有复杂的权限控制,这里就不介绍了。这部分内容也就交给你自己发挥了。
以上就达到了我们要的效果,我们可以看到,代码并不难,但是可以节省我们在升级时要手工操作的很多时间,而且用户绝对用起来是非常之方便的。
- 转:说说“数据库的自动安装、升级”
- 数据库升级安装的过程
- Android数据库自动升级
- 说说spring的自动装配
- sqlite数据库自动升级设计
- sqlite数据库自动升级设计
- T43驱动自动升级安装
- 解决Android端升级安装后自动打开的问题
- 解决Android端升级安装后自动打开的问题
- 【转】如何关闭 Chrome 的自动升级
- 自动升级的分析
- 自动升级的稳定性
- R 的自动升级
- 说说安装bugfree的历程
- 说说PHP5的自动加载类机制
- 说说PHP的autoLoad自动加载机制
- 说说PHP的autoLoad自动加载机制
- iOS App升级安装 - CoreData数据库升级
- Silverlight 1.1正式更名为Silverlight 2.0
- 我心目中的编程高手
- Web MVC框架-视图模板查找及组织
- DataOutputStream 类与BufferedOutputStream类的区别是什么
- ajax聊天室原理实现网站更新信息提示效果
- 转:说说“数据库的自动安装、升级”
- 2007十大网络新名词
- [Linux] linux下的GetModuleFileName函数
- 用Java EE 5实现的网上书店实例文件下载- (NetBeans 6.0)
- 回首以往
- XML-RPC协议
- 搜索实现
- TinyXML中文文档
- 关于log4j