设为首页 收藏本站
查看: 954|回复: 0

[经验分享] .Net程序打包安装与卸载制作 ——怎样在打包程序中自动安装SQL Server数据库(三)?

[复制链接]

尚未签到

发表于 2015-6-30 09:42:33 | 显示全部楼层 |阅读模式
  怎样在打包程序中自动安装SQL Server数据库?

1、创建安装项目“Setup1”安装项目
在“文件”菜单上指向“添加项目”,然后选择“新建项目”。
在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“安装项目”。在“名称”框中键入 “setup1”。
单击“确定”关闭对话框。
项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。
在“属性”窗口中,选择 ProductName 属性,并键入”亿万电器成套报价系统”。

2、在安装项目中创建安装程序类(install.cs)。
添加创建数据库(InstallDatabase.txt)、删除数据库(DropDatabase.txt)、初始化数据基本数据(InitializeData.txt)脚本文件,将属性“生成操作”设为“嵌入的资源”。代码如下:
using System;

using System.Collections;

using System.ComponentModel;

using System.Configuration.Install;

using System.Data;

using System.Data.SqlClient;

using System.IO;

using System.Reflection;

using System.Text.RegularExpressions;

using System.Windows.Forms;

using System.Text;

using Microsoft.Win32;


namespace install

{

     ///

     /// Installer 的摘要说明。

     ///

     [RunInstaller(true)]

     public class Installer : System.Configuration.Install.Installer

     {

         ///

         /// 必需的设计器变量。

         ///

         string conStr="packet size=4096;integrated security=SSPI;"+

              "data source=\"(local)\";persist security info=False;"+

              "initial catalog=master;connect timeout=300";

         RijndaelCryptography rijndael = new RijndaelCryptography();

         private System.ComponentModel.Container components = null;


         public Installer()

         {

              // 该调用是设计器所必需的。

              InitializeComponent();


              // TODO: 在 InitializeComponent 调用后添加任何初始化

         }


         ///  

         /// 清理所有正在使用的资源。

         ///

         protected override void Dispose( bool disposing )

         {

              if( disposing )

              {

                   if(components != null)

                   {

                       components.Dispose();

                   }

              }

              base.Dispose( disposing );

         }


         #region 组件设计器生成的代码

         ///

         /// 设计器支持所需的方法 - 不要使用代码编辑器修改

         /// 此方法的内容。

         ///

         private void InitializeComponent()

         {

              components = new System.ComponentModel.Container();

         }

         #endregion


         #region 重载自定义安装方法

         protected override void OnBeforeInstall(IDictionary savedState)

         {

              base.OnBeforeInstall (savedState);

         }

         public override void Install(IDictionary stateSaver)

         {

              base.Install (stateSaver);

              string databaseServer = Context.Parameters["server"].ToString();

              string userName = Context.Parameters["user"].ToString();

              string userPass = Context.Parameters["pwd"].ToString();

              string targetdir = this.Context.Parameters["targetdir"].ToString();

         

              conStr = GetLogin(databaseServer,userName,userPass,"master");

              SqlConnection  sqlCon = new SqlConnection();


              try

              {

                  

                   sqlCon.ConnectionString = conStr;

                   sqlCon.Open();


                   rijndael.GenKey();

                   rijndael.Encrypt(conStr);


                   stateSaver.Add("key",rijndael.Key);

                   stateSaver.Add("IV",rijndael.IV);

                   stateSaver.Add("conStr",rijndael.Encrypted);

              

                   ExecuteSql(sqlCon,"InstallDatabase.txt");

                   ExecuteSql(sqlCon,"InitializeData.txt");

     

                   if(sqlCon.State!=ConnectionState.Closed)sqlCon.Close();

              }

              catch(SqlException)

              {

                   MessageBox.Show("安装失败!\n数据库配置有误,请正确配置信息!","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);

                   if(sqlCon.State!=ConnectionState.Closed) sqlCon.Close();

                   this.Rollback(stateSaver);

              }


         }

         protected override void OnAfterInstall(IDictionary savedState)

         {

              base.OnAfterInstall(savedState);

         }


         public override void Rollback(IDictionary savedState)

         {

              base.Rollback (savedState);

         }

         public override void Uninstall(IDictionary savedState)

         {

              base.Uninstall (savedState);

              if(savedState.Contains("conStr"))

              {

                   string targetdir = this.Context.Parameters["targetdir"].ToString();

                   RijndaelCryptography rijndael = new RijndaelCryptography();

                   rijndael.Key = (byte[])savedState["key"];

                   rijndael.IV = (byte[])savedState["IV"];

                   conStr = rijndael.Decrypt((byte[])savedState["conStr"]);     

                   SqlConnection sqlCon = new SqlConnection(conStr);

                   ExecuteDrop(sqlCon);

              }

         }

         #endregion


         #region 数据操作方法

         //从资源文件获取中数据执行脚本

private static string GetScript(string name)

         {

              Assembly asm = Assembly.GetExecutingAssembly();

              Stream str = asm.GetManifestResourceStream(asm.GetName().Name+ "." + name);

              StreamReader reader = new StreamReader(str,System.Text.Encoding.Default);

              System.Text.StringBuilder output = new System.Text.StringBuilder();

              string line = "";

              while((line = reader.ReadLine())!=null)

              {

                   output.Append(line + "\n");

              }

              return output.ToString();


         }

         //获取数据库登录连接字符串

         private static string GetLogin(string databaseServer,string userName,string userPass,string database)

         {

              return "server=" + databaseServer + ";database="+database+";User ID=" + userName + ";Password=" + userPass +";connect timeout=300;";

         }

         //执行数据库脚本方法

         private static void ExecuteSql(SqlConnection sqlCon,string sqlfile)

         {

              string[] SqlLine;

              Regex regex = new Regex("^GO",RegexOptions.IgnoreCase | RegexOptions.Multiline);

              

              string txtSQL = GetScript(sqlfile);

              SqlLine = regex.Split(txtSQL);


              if(sqlCon.State!=ConnectionState.Closed)sqlCon.Close();

              sqlCon.Open();


              SqlCommand cmd = sqlCon.CreateCommand();

              cmd.Connection = sqlCon;


              foreach(string line in SqlLine)

              {

                   if(line.Length>0)

                   {

                       cmd.CommandText = line;

                       cmd.CommandType = CommandType.Text;

                       try

                       {

                            cmd.ExecuteNonQuery();

                       }

                       catch(SqlException ex)

                       {

                            //rollback

                            string ss = ex.Message;

                            ExecuteDrop(sqlCon);

                            break;

                       }

                   }

              }

         }

         //删除数据库

         private static void ExecuteDrop(SqlConnection sqlCon)

         {   

              if(sqlCon.State!=ConnectionState.Closed)sqlCon.Close();

              sqlCon.Open();

              SqlCommand cmd = sqlCon.CreateCommand();

              cmd.Connection = sqlCon;

              cmd.CommandText = GetScript("DropDatabase.txt");

              cmd.CommandType = CommandType.Text;

              cmd.ExecuteNonQuery();

              sqlCon.Close();

         }

         #endregion
}
     单击“生成”菜单下“生成解决方案”,生成install.dll安装类文件。
3、将“主程序”项目的输出添加到部署项目中
     在“文件系统编辑器”中,选择“应用程序文件夹”,单击右键指向“添加”,添加“项目输出”。
     在“添加项目输出组”对话框中,选择“项目”下拉表框中选择你的主安装程序类,如上面的“install”。
     从列表框中选择“主输出”组,然后单击“确定”关闭。
4、创建自定义安装对话框
在解决方案资源管理器中选择安装项目“Setup1”项目,在“视图”菜单上指向“编辑器”,然后选择“用户界面”。
在用户界面编辑器具中,选择“安装”下的“启动”节点。在“操作”菜单上,选择“添加对话框”。
在“添加对话框”中选择“文本框(A)”对话框,然后单击“确定”关闭对话框。
在“操作”菜单上,选择“上移”,重复此步骤,移到“安装文件夹”上。
     在“文本框(A)”上单击“属性窗口”,设置如下图所示:
      DSC0000.gif
5、建自定义操作
在解决方案资源管理器中选择安装项目“Setup1”项目,在“视图”菜单上指向“编辑器”,然后选择“自定义操作”。
在“自定义操作编辑器”中选择“安装”节点。单击右键“添加自定义操作”,在选择项目中的项中选择“应用程序文件夹”,选择“主输出来自install(活动)”。
在“属性窗口”中选择“CustomActionData”属性并键入“/server=[EDITA1] /user=[EDITA2] /pwd=[EDITA3]  /targetdir="[TARGETDIR]\"”。

附:/targetdir="[TARGETDIR]\"是安装后的目标路径,为了在install类中获得安装后的路径,我们设置此参数。
单击“生成”菜单下的“生成解决方案”,编译安装项目。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81835-1-1.html 上篇帖子: SQL SERVER索引优化系列之二:索引性能考虑 下篇帖子: SQL Server 中查询非中文,非英文,非数字的特殊列
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表