使用DbUp完成数据库更新

摘要:
升级信息<foreach(varconnectionStringinconnectionStringList){connectionStringBuilder=newSqlConnectionStringBuilder(connectionString);updateResult){break;

DbUp可以帮我们创建数据库,通过脚本文件创建表、添加数据;并可通过新创建脚本文件升级现有数据库

每个脚本文件只会执行一次,如果需要修改表结构或添加数据,添加新sql脚本文件,而不要修改原文件。DbUp通过向目标数据库中添加表SchemaVersions,存储脚本文件执行记录

脚本文件0001、0002、0003....按顺序执行

安装:

dbup-core  (如果使用.NET Framework框架,安装dbup)

dbup-sqlserver  (sqlserver数据库扩展,也可选择其他数据库扩展包)

项目截图:

使用DbUp完成数据库更新第1张

助手类:

    public class UpdateDBHelper
    {
        /// <summary>
        /// Sql脚本路径格式
        /// </summary>
        private const string SCRIPT_PATH_FORMAT = "./SqlScripts/{0}";
        /// <summary>
        /// 升级数据库
        /// 注意:所有需要执行的Sql脚本必须按照严格版本顺序排序
        /// </summary>
        /// <param name="connectionString">连接字符串</param>
        /// <param name="message">升级信息</param>
        /// <returns>升级是否成功</returns>
        public static bool UpdateDb(List<string> connectionStringList, out string message)
        {

            bool updateResult = true;
            message = string.Empty;
            SqlConnectionStringBuilder connectionStringBuilder = null;
            string scriptPath = string.Empty;
            string dbName = string.Empty;
            foreach (var connectionString in connectionStringList)
            {
                connectionStringBuilder = new SqlConnectionStringBuilder(connectionString);
                dbName = connectionStringBuilder.InitialCatalog;
                scriptPath = string.Format(SCRIPT_PATH_FORMAT, dbName);
                updateResult = UpdateSingleDb(connectionString, scriptPath, out message);
                if (!updateResult)
                {
                    break;
                }
                else
                {
                    Console.WriteLine($"{dbName} 升级成功!");
                }
            }
            return updateResult;
        }

        private static bool UpdateSingleDb(string connectionString, string path, out string message)
        {
            message = "";

            //检查数据库是否存在,如果不存在就创建然后运行脚本
            EnsureDatabase.For.SqlDatabase(connectionString);

            var updateEngineBuilder = DeployChanges.To
                .SqlDatabase(connectionString)
                .WithScriptsFromFileSystem(path)
                .LogToConsole();
            updateEngineBuilder.Configure(configure => { configure.ScriptExecutor.ExecutionTimeoutSeconds = 28800; });
            var updateEngine = updateEngineBuilder.Build();

            if (!PreUpdate(updateEngine, out message))
            {
                return false;
            }

            var result = updateEngine.PerformUpgrade();//升级数据库
            if (!result.Successful)
            {
                message = result.Error.ToString();
                return false;
            }

            return true;
        }


        /// <summary>
        /// 升级前检查
        /// </summary>
        /// <param name="upgradeEngine"></param>
        /// <param name="errorMsg"></param>
        /// <returns></returns>
        private static bool PreUpdate(UpgradeEngine upgradeEngine, out string errorMsg)
        {
            errorMsg = string.Empty;
            if (!upgradeEngine.TryConnect(out errorMsg))
            {
                return false;
            }
            //判断是否有数据库版本信息
            var sqlList = upgradeEngine.GetDiscoveredScripts();
            if (sqlList.Count == 0)
            {
                errorMsg = "升级数据库:找不到数据库版本,无法初始化数据库!";
                return false;
            }
            //版本控制是否异常
            if (upgradeEngine.GetExecutedButNotDiscoveredScripts().Count > 0)
            {
                errorMsg = $"版本控制异常,存在 {upgradeEngine.GetExecutedButNotDiscoveredScripts().Count} 个异常版本!";
                return false;
            }

            return true;
        }


    }

使用:

        static void Main(string[] args)
        {
            List<string> connectionStringList = new List<string> { "Data Source=xx.xx.xx.xx,30705;uid=sa;pwd=xxxxxxxxx;Initial Catalog=test3;Pooling=true;Max Pool Size=1000;Min Pool Size=5;Connection Timeout=28800" };
            string updateDbMessage = string.Empty;
            Console.WriteLine("更新数据库 开始。。。。");
            bool updateDbResult = UpdateDBHelper.UpdateDb(connectionStringList, out updateDbMessage);
            if (!updateDbResult)
            {
                Console.WriteLine($"更新数据库 失败!-{updateDbMessage}");
            }
            else
            {
                Console.WriteLine("更新数据库 成功!");
            }
            Console.ReadKey();
        }

参考:https://dbup.readthedocs.io/en/latest/

免责声明:文章转载自《使用DbUp完成数据库更新》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VGG16迁移学习实现qDebug 学习小结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android的简述4

 NoteEditor深入分析   首先来弄清楚“日志编辑“的状态转换,通过上篇文章的方法来做下面这样一个实验,首先进入“日志编辑“时会触发onCreate和onResume,然后用户通过Option Menu选择”Edit title”后,会触发onSaveInstanceState和onPause,最后,用户回到编辑界面,则再次触发onResume。  ...

使用 SQLite 数据库

Android 提供了对 SQLite 数据库的完全支持。每个 App 使用自己的数据库,App 内所有类都可以通过名字访问创建的数据库,但只限于此 App 内。 推荐使用一个继承 SQLiteOpenHelper 的子类,重写 onCreate() 方法去创建一个的 SQLite 数据库。通过执 行 SQLite 命令去创建数据库表。例如: Create...

[Project] HUSTOJ随笔

转载自 : http://blog.csdn.net/zhblue/article/details/7259940 (版权为 zhblue) HUSTOJ http://code.google.com/p/hustoj 是一个开源OnlineJudge系统,广泛应用于计算机程序设计比赛和编程能力测试。 从代码上HUSTOJ分为两大部分,core...

RAC一个节点自动重启问题分析

题记:在RAC数据库的故障当中,节点重启的现象很常见,在这种问题的处理当中,有一定的规律性。为了更好的说明这个问题的处理过程,保证出现该类问题的时候,能够有序的进行处理,特编写此文档。  问题现象描述   此问题的现象比较明显,也就是数据库自动重启,或者是节点自动重启,客户端在数据库重启期间无法连接数据库,导致业务断连的现象。这种情况如果出现在业务高峰期间...

数据库空间不足造成插入数据库时提示“因为文件组primary已满,未能为数据库XX对象XX分配空间”

        一大早刚进办公室就陆续接到电话说创建某某单据时提示“因为文件组primary已满,未能为数据库XX对象XX分配空间”。自从接手BASIS工作以来第一次遇到这样的问题。真是有点手忙脚乱的。因为是月结期间更是火上浇油了。打开数据库属性看了一下,可用空间为0。看一下数据库文件,三个文件都已经达到了10240M了,因为第一次遇到这样的问题也没敢下结...

C#使用SqlSugar操作数据库导致的问题:托管调试助手“FatalExecutionEngineError”:运行时遇到了 错误。此错误的地址为。。。。

使用SqlSugar操作数据一定要注意: 对象的属性类型和数据库的字段类型要保持一致 对象的属性类型和数据库的字段类型要保持一致 对象的属性类型和数据库的字段类型要保持一致 本人基础太差了,这个小问题我从下午2点一致排错了23:00,终于解决了。 1,SqlSugar操作数据的代码 public class TighteningResultServi...