在打包程序中自动安装SQL Server数据库 .

原文:在打包程序中自动安装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

{

     /// <summary>

     /// Installer 的摘要说明。

     /// </summary>

     [RunInstaller(true)]

     public class Installer : System.Configuration.Install.Installer

     {

         /// <summary>

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

         /// </summary>

         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 调用后添加任何初始化

         }

 

         /// <summary>

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

         /// </summary>

         protected override void Dispose( bool disposing )

         {

              if( disposing )

              {

                   if(components != null)

                   {

                       components.Dispose();

                   }

              }

              base.Dispose( disposing );

         }

 

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

         /// <summary>

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

         /// 此方法的内容。

         /// </summary>

         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)”上单击“属性窗口”,设置如下图所示:

    

5、建自定义操作

在解决方案资源管理器中选择安装项目“Setup1”项目,在“视图”菜单上指向“编辑器”,然后选择“自定义操作”。

在“自定义操作编辑器”中选择“安装”节点。单击右键“添加自定义操作”,在选择项目中的项中选择“应用程序文件夹”,选择“主输出来自install(活动)”。

在“属性窗口”中选择“CustomActionData”属性并键入“/server=[EDITA1] /user=[EDITA2] /pwd=[EDITA3]  /targetdir="[TARGETDIR]/"”。

 

附:/targetdir="[TARGETDIR]/"是安装后的目标路径,为了在install类中获得安装后的路径,我们设置此参数。

单击“生成”菜单下的“生成解决方案”,编译安装项目。

 

 

添加一个class到打包程序中,可以解决很多打包程序无法解决的问题

其它相关:
      
转自:http://www.cnblogs.com/jyshi/

时间: 2025-01-20 16:48:33

在打包程序中自动安装SQL Server数据库 .的相关文章

自动安装SQL Server数据库

server|数据|数据库|自动安装 这段时间,手头的项目接近收尾,以前不太注意的工程打包问题却慢慢凸现出来,这里指的不单单是制作一个可以安装的工程安装包,还有关于缺少运行环境时的数据库实例的安装和数据库数据的安装恢复.这里先把关于MSDE打包进安装程序的心得于大家分享,那么咱们废话少说. 当你的项目基本完成测试,准备发布的时候,制作一个用户使用简便的自动安装包就成为编码完成后的又一个需要解决的问题,工程开发的是否完满,从安装中,用户应该会有个最初的体验. 下面简单介绍一下如何在工程中添加Mic

我在使用VS写asp.net,web应用程序中如何连sql server 接数据库

问题描述 我在使用VS写asp.net,web应用程序中如何连sql server 接数据库 10C 在web程序中我需要连接数据库,使用其中的数据.怎样才能用js与我的sql server2012连接,有没有具体的列子啊!新手求大神解答. 解决方案 用js与数据库连接还是第一次听说,你如果需要执行数据操作是需要后端语言的,Web应用在后台代码中可以用ADO.NET技术来进行数据操作.可以前台js 使用Ajax Post后者Get请求后端接口,后端进行数据库的增删改查.如果是服务器控件直接在事件

Visual C#中动态操作SQL Server数据库

在编写数据库应用程序的时候,我们可以通过SQL语句来动态创建.修改数据库以及其中的对象.本文我就向大家介绍如何运用Visual C#来动态操作SQL Server数据库,其中包括如何创建一个SQL Server数据库以及如何创建其中的表.存储过程.视图.索引之类的数据库对象.本文还介绍了如何动态地修改表的模式,如何从表.存储过程以及视图中读取数据并显示在应用程序的数据库控件中. 我们知道SQL语句在操作数据库时运用得最多的是Select.Insert.Update和Delete等对于数据的操作,

winform打包 c#-winform打包求过程,包含sql server 数据库

问题描述 winform打包求过程,包含sql server 数据库 最近写了个winform程序,已近尾声,就是还有个文件部署打包问题,弄了好久,还是没成功,主要是有两个数据库(sql server2008)整的纠结,看过好多资料,但是都没有涉及到添 加数据库的样板,各位大神,求过程.

vista中如何安装SQL Server 2005

下文为您介绍在vista系统下安装SQL Server 2005 数据库系统的详细方法步骤,供您参考,希望对您有所帮助. vista系统支持SQL Server 2005 Express Edition和SQL Server 2005 Developer Edition,但是如果要安装其他版本,就需要相应的访问权限.Vista 操作系统下的"用户帐户控制 (UAC)"允许用户以非管理员身份执行常见任务.作为本地 Administrators 组成员的 Windows 用户帐户可运行大多

打包,并自动安装SQL数据库

打包|数据|数据库|自动安装 应一位网友的需求,并修正了MVP李洪根".NET平台下WEB应用程序的部署(安装数据库和自动配置)"中的osql用法错误,已测试通过. 一).创建部署项目 1. 在"文件"菜单上指向"添加项目",然后选择"新建项目". 2. 在"添加新项目"对话框中,选择"项目类型"窗格中的"安装和部署项目",然后选择"模板"窗格中的

在asp.net中备份还原SQL Server数据库

在web中,安全性主要体现在两个方面:一个是程序安全性,即防止网页在插入恶意代码:另一个是数据库安全性,这个我们可以经常备份数据库来实现. 在文中,我将演示如果在网页中备份和恢复数据库. 其实备份和恢复数据库都是利用SQL Server提供的SQL语句来备份的. 备份:use master;backup database @name to disk=@path; 恢复:use master;restore database @name from disk=@path; 上面用的是参数化SQL语句

在JSP中访问MS SQL Server数据库_JSP编程

下面介绍如何用SQL Server实现一个动态FAQ(常见问题及答案)网站.首先建立一个数据库faq,其中的表faqs有字段id(int,自动增量,并设为主关键字).subject(varchar,200).answers(text).这个表中可以存放一些编程知识的常见问题及答案.然后,在Control Panel(控制面板)的ODBC Datasource模块中加入System DSN,取名faq,并指向faq数据库.创建一个JavaBean,名为faq.java,并保存在C:\JBuilde

PowerDesigner中如何导入SQL Server数据库_mssql2005

再用PD建表完成后导成SQL脚本然后在SQL Server中运行后生成数据库后,就想到,可不可以将直接将数据库的内容生成PD文档?经过上网查,当然可以的. 要将SQL Server中的数据库导入到PD中,首先需要建立一个数据库的链接,然后进行逆向工程的操作.下面开始操作. 第一步:打开数据库菜单,选择"Configure Connections" 第二步:创建新的ODBC链接 第三步:选择系统数据源 第四步:选择需要的数据库 第五步:"完成" 第六步:命名数据源,并