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

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

  1. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  2. core 中ef 连接sql server数据库 在类库中 自动生成 model

    首先 介绍 Scaffold-DbContext "Server=.;database=sdd;User Id=sa;Password=123456;" Microsoft.Ent ...

  3. windows系统下,在C#程序中自动安装字体

    在Windows系统中,原有自带的字体样式有限,有时候我们的程序会使用到个别稀有或系统不自带的字体.因此我们需要将字体打包到程序中,当程序启动时,检测系统是否有该字体,如果没有则安装该字体,也可以动态 ...

  4. 偶然发现有的IIS里的程序,连接 不上SQL Server数据库, 超时

    经查应用程序池中, 有一个启用32位应用程序,  有时打开它就能连接上SQL SERVER了.

  5. 在Docker中使用Microsoft SQL Server数据库

    下图中对SQL Server容器创建及数据库创建等操作进行了记录,方便自己日后查看.(文中的 * 仅表示隐藏自己的个人信息,手动马赛克,哈哈-) Docker下载可看上一篇博文mac系统,docker ...

  6. 安装SQL Server 2005

    在安装SQL Server 2005时,经常会遇到一些错误,从而使系统无法正常安装.下面讲解在安装过程中经常出现的一些错误及其解决的方法.1.解决在安装SQL Server 2005时安装程序被挂起的 ...

  7. 安装sql server提示挂起报错

    在安装sql server时出现“以前的某个程序安装已在安装计算机上创建挂起的文件操作.运行安装程序之前必须重新启动计算机”错误.无法进行下去. 参考有关资料后,以下步骤基本可以解决: 1)添加/删除 ...

  8. 安装 SQL Server 2008 R2 的硬件和软件要求(转)

    以下各部分列出了安装和运行 SQL Server 2008 R2 的最低硬件和软件要求.有关 SharePoint 集成模式下的 Analysis Services 的要求的详细信息,请参阅硬件和软件 ...

  9. SQL Server 数据库定时自动备份

    原文:SQL Server 数据库定时自动备份 SQL Server 数据库定时自动备份——每天定时备份,保留前8天的备份 利用SQL Server代理新建作业来定期备份 1)在数据库库的[SQL S ...

随机推荐

  1. Oracle中merge into的使用 (转)

    该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1.ins ...

  2. HDU - 5036 Operation the Sequence

    Problem Description You have an array consisting of n integers: a1=1,a2=2,a3=3,-,an=n. Then give you ...

  3. 处理FTP上传成功推理

    #登录FTPserver获取指定文件 #$1:server住址 #$2:帐户 #$3:password #$4:文件路径名 #$5:本地文件路径名 #$6:本地文件名 #比量ftp上传结果: #获取上 ...

  4. 设计模式之前奏(UML类图)

    原文:设计模式之前奏(UML类图) 本人菜菜一个,最近一直在博客园游走闲逛,看到了各种技术,各种各种…….便看到了大话设计模式这本书,下了电子版的看了看第一章,感觉相当不错,不仅通俗易懂,而且与实际案 ...

  5. js 网上见到的动画函数 备份

    <script> function startMove(obj,json,fn){ clearInterval(obj.timer); obj.timer = setInterval(fu ...

  6. adp设备是什么

    今天在写软工文档的可行性分析部分的时候.遇到一个新名词--adp,瞬间就不淡定了.原话例如以下: 6.1.1 基本建设投资 包含採购.开发和安装下列各项所需的费用,如: a. 须要提供一件教室,供开发 ...

  7. 四、Linux/UNIX操作命令积累【chmod、chown、tail】

    正在使用Linux/UNIX下一个.经常使用文本界面来设置系统或操作系统,笔者也是在指挥这方面工作的过程中不断的接触.因此,为了此特酝酿.准备.開始了本文的编写.本文主要记录自己平时遇到的一些Linu ...

  8. 博客搬到了http://xianglong.me

    自己用Django建立个人博客.这个博客的部分已经迁移到新的个人博客. 博客地址:龙 (http://xianglong.me),欢迎. 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  9. React的React Native

    React的React Native React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React ...

  10. uva10067 Playing with Wheels 【建图+最短路】

    题目:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1008">uva10067 Play ...