应客户需求,要求实现一个版本一键升级的功能,咨询过同事之后弄了个demo出来,后台代码如下:

  //DBConnModelInfo:连接字符串的对象 (包含数据库实例名,数据库名,登陆名,登陆密码)

  public bool DBVersionSaveData(DBConnModelInfo mdl)
        {
            bool result = false;

try
            {
                int timeout = 60000; //设置执行超时时间,单位毫秒
                string prversion = WebConfig.Version;//程序版本
                string dbversion = new BSystemParameter().GetDBVersion();//数据库版本
                
                //升级脚本的物理路径
                string root = "DataBase\\Update";
                string folder = prversion;
                string rootpath = Path.Combine(root, folder);
                string dirpath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, rootpath);

string filepath = Path.Combine(dirpath, "Update.sql");//升级脚本
                string logpath = Path.Combine(dirpath, "Update.txt");//存放执行结果
                string destfilename = string.Format("Update_{0}.sql", mdl.InitialCatalog);//要执行升级的脚本(升级脚本的副本,不改变原升级脚本)
                string destfilepath = Path.Combine(dirpath, destfilename);

if (System.IO.File.Exists(destfilepath))
                {
                    Tools.DeleteFile(@destfilepath);//删除文件
                }
                //将升级脚本的内容复制到副本
                if (!System.IO.File.Exists(destfilepath))
                {
                    using (StreamWriter sw = new StreamWriter(destfilepath, true, Encoding.Unicode))
                    {
                        sw.WriteLine(string.Format("Use [{0}]", mdl.InitialCatalog));//mdl.InitialCatalog 数据库名
                        sw.WriteLine("Go");

string[] rals = System.IO.File.ReadAllLines(@filepath);
                        foreach (string s in rals)
                        {
                            sw.WriteLine(s);
                        }
                    }
                }
                //执行升级脚本
                if (System.IO.File.Exists(destfilepath))
                {
                    Process p = new Process();
                    p.StartInfo.FileName = "osql.exe"; //执行脚本的方式
                    /* -S:数据库实例名  -U:登录名 -P:密码 -i:升级的脚本路径 -o:执行后结果存放路径  */
                    string args = string.Format(@"-S {0}  -U {1} -P {2} -i ""{3}"" -o ""{4}""", mdl.DataSource, mdl.UserID, mdl.Password, destfilepath, logpath);
                    p.StartInfo.Arguments = args;
                    p.StartInfo.UseShellExecute = false;
                    p.StartInfo.CreateNoWindow = true;
                    p.Start();
                    p.WaitForExit(timeout);
                    p.Close();

result = true;
                }                
            }
            catch (Exception ex)
            {
                Tools.Log(this.GetType().Name, new StackFrame(1).GetMethod().Name, ex);//错误日志
                result = false;
            }
            
            return result;
        }

最新文章

  1. 非RootLayer的隐式动画
  2. Android Touch事件传递机制 二:单纯的(伪生命周期)
  3. emacs配置eslint 语法检查.找不到node解决
  4. BGP--边界网关协议
  5. SQL中的JOIN类型解释(CROSS, INNER,OUTER),关键字ON,USING
  6. 关于.net 中Clipboard.GetDataObject() 之后读出数据读出的数据都是相同的解决方法
  7. ASP.NET中进行消息处理(MSMQ) 二
  8. Pongo建立信号基站-实际上还是考中位数
  9. SQLServer获取最后插入的ID值SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的比较
  10. 仿照淘宝首页做的一个高度伪对齐demo
  11. Android中用友盟实现QQ的第三方登录
  12. shell的EOF用法
  13. protobuf 编码实现解析(java)
  14. 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据)
  15. 正则表达式之 \b
  16. Thymeleaf3语法详解
  17. BZOJ3736 : [Pa2013]Karty
  18. Ubuntu下修改CMake版本
  19. javascript promises powered by BlueBird
  20. Windows下解压分卷压缩方法

热门文章

  1. iTerm2 + Oh My Zsh 打造舒适终端体验[mac os系统]
  2. 网络远程唤醒 WOL Magic Packet【转】
  3. nginx配置多个静态资源
  4. (九)OpenStack---M版---双节点搭建---Swift(单节点)安装和配置
  5. SDL2学习(一): 显示一张图片
  6. 201871010101-陈来弟《面向对象程序设计(java)》第十五周学习总结
  7. (转)LoadRunner集合点设置1
  8. zz全面拥抱Transformer
  9. Linux学习笔记-第8天 - 看似很简单
  10. CSS3中的px,em,rem,vh,vw