• 说说“数据库的自动安装、升级” [转]


    数据库的自动安装、升级是一个非常实用的功能,在初次安装软件,升级软件的时候可以节省大量的时间和无趣的工作,而且也节省了给用户写数据库升级指导的说明。

    要实现数据库的自动安装、升级,其实并不难。我们在肥猫博客中,提供了这样的功能。每次程序升级,自己用起来都觉得非常地爽,不用繁琐的指导用户,也不用无趣的操作。那么在这里我们就介绍下如何像肥猫博客一样在asp.net中提供这样的功能。

    首先,我们要对sql语句非常熟悉,数据库的自动安装和升级都是基于sql脚本的,准备好脚本文件是必须的。

    一般来讲,会存在多个脚本文件:

    1.         第一次安装所需要的脚本文件

    2.         每一次升级所需要的脚本文件。这个升级脚本文件只需要提供从上一版本升级过来所需要的Sql语句就可以,其他的都不需要。

    建立一份版本历史文件,这一般可以是一个xml文件,类似如下:

    <?xml version="1.0" encoding="utf-8"?>

    <sqlscripts>

        <sqlscript dbversion="1.1" dspt="V1.0V1.10的升级包:增加了皮肤的数据" filename="v1_1.sql" />

        <sqlscript dbversion="1.11" dspt="V1.10V1.11的升级包:增加了订阅中最新文章的处理" filename="v1_11.sql" />

        <sqlscript dbversion="1.2" dspt="V1.11V1.20的升级包:增加了垃圾信息、IP管理" filename="v1_2.sql" />

        <sqlscript dbversion="1.3" dspt="V1.20V1.30的升级包:增加了流量统计分析" filename="v1_3.sql" />

        <sqlscript dbversion="1.4" dspt="V1.30V1.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";

                        }

                    }

                }

            }

    就这样,数据库的自动安装、升级代码就完成了。这里比较重要的就是脚本文件了,脚本文件应该要包含所有对数据库的更新内容,否则是达不到预期效果的。

    除了以上讲的数据库安装/升级的核心代码外,你可能还需要对该功能进行权限控制。由于我们在肥猫博客中,只有管理员才能够升级,所以没有复杂的权限控制,这里就不介绍了。这部分内容也就交给你自己发挥了。

    以上就达到了我们要的效果,我们可以看到,代码并不难,但是可以节省我们在升级时要手工操作的很多时间,而且用户绝对用起来是非常之方便的。

  • 相关阅读:
    期权波动率模型及交易策略分析
    k阶原点距和k阶中心距各是说明什么数字特征
    在Linux中监视IO性能
    NUMA微架构
    Web网站的几个QPS
    Elasticsearch与Solr 选型
    相关连接(后续更新)
    linux_基本命令使用(后续更新)
    centos7.5安装kafka(支持外部连接)
    centos7.5单机安装安装zookeeper
  • 原文地址:https://www.cnblogs.com/ghx88/p/633721.html
Copyright © 2020-2023  润新知