10.
最后还要保证我们项目运行所必须的环境
(.Net Framework
等
)
右键单击安装项目的项目名
,
进入属性
点击系统必备
11.
在
DBClassLiabrary
类库的
MyInstaller.cs
文件中编写安装数据库的代码
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Configuration.Install;
using
System.Data.SqlClient;
using
Microsoft.Win32;
namespace
DBAction
{
[RunInstaller(true)]
public partial class MyInstaller : Installer
{
public MyInstaller()
{
InitializeComponent();
}
private void ExecuteSql(string connString, string DBName, string sqlString)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand comm = new SqlCommand(sqlString, conn);
try
{
conn.Open();
conn.ChangeDatabase(DBName);//
更改当前数据库
comm.ExecuteNonQuery();
}
catch (SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}
}
//
重写
Install
方法
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
try
{
//
创建数据库
string connStr = string.Format("data source={0}; user id={1}; password={2}; persist security info = false; packet size=4096",
this.Context.Parameters["server"], this.Context.Parameters["User"],
this.Context.Parameters["pwd"]);
ExecuteSql(connStr, "master", "create database " + this.Context.Parameters["dbname"]);
//
创建一个进程用来执行
sql
脚本
---
建表
System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();
//
设置该进程要启动的文档是
"osql.exe"
,这个执行文件用来在命令行执行
sql
脚本文件
sqlProcess.StartInfo.FileName = "osql.exe";
//
配置进程需要的参数
//Context.Parameters--
获取在运行
InstallUtil.exe
时输入的命令行参数
sqlProcess.StartInfo.Arguments = string.Format("-U {0} -P {1} -i {2}bankDB.sql",
this.Context.Parameters["user"], this.Context.Parameters["pwd"],
this.Context.Parameters["targetdir"]);
sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
}
catch (Exception ex)
{
Console.Write(ex.ToString());
}
}
/// <summary>
///
重载
OnBeforeInstall,
确定是否安装
.NETFramework
/// </summary>
protected override void OnBeforeInstall(System.Collections.IDictionary savedState)
{
base.OnBeforeInstall(savedState);
try
{
Microsoft.Win32.RegistryKey key;//
定义注册表键
//
读取相同位置上的信息,若
key
为空,则不存在此键值,则进行安装;相反为存在则不安装
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\.NETFramework", true);
if (key == null)
{
Process.Start(Context.Parameters["targetdir"].ToString() + @" dotnetfx \dotnetfx.exe");//
得到安装后文件的路径,并通过路径和文件名来启动
}
}
catch (Exception e)//
抓取错误信息,并给予提示
{
MessageBox.Show("
安装程序错误!错误提示:
"
+ e.Message);
}
}
}
}
提示:
在
bankDB.sql
脚本文件中最好加上
USE bankDB GO
,
为了使安装程序程序能够正确运行,必须确保你的
bankDB.sql
脚本文件准确无误,检查方法就是在命令行中输入:
C:> osql �CU sa �CP 123 �Ci D:\
打包示例
\bankDB.sql
如果在你自己的机器上能生成数据库
bankDB
,就说明
sql
脚本没错
12.
整个解决方案全部完成后,请分别生成
3
个项目的执行文件,确保得到最新结果。其中在
MyProjSetup
的
Debug
文件夹中的就是我们需要的结果
我们双击
setup.exe
或者
MyProjSetup.msi
之后
,
就能够在目标计算机上安装
bank
数据库和我们自己的
MyProjectV2
的执行文件了
我的目标文件选择的是
D:\SetupDemo
,最后在该文件夹下的文件如下:
可以看到在目标机器上的目标路径下包含了项目所需要的各个类库、文件等等,以及自己的执行文件
/dbname=[EDITA1] /server=[EDITA2] /user = [EDITA3] /pwd = [EDITA4] /targetdir="[TARGETDIR]\" -------
错误
/dbname=[EDITA1] /server=[EDITA2] /user=[EDITA3] /pwd=[EDITA4] /targetdir="[TARGETDIR]\" -------
正确
切记切记:
/key=[value]
之间绝对不能有空格
最后需要在目标机器上安装
.net framework.
另外
app.Config
配置文件也可以打包,而且在打包后会自动出现在目标机器的目标文件夹,因此并不存在打包后无法修改配置文件的情况。
<appSettings>
<add key=”connStr”value=”………”>
</ appSettings >
注意需要添加引用
System.Configration
点击系统必备
选择你需要的组件
,
如
.Net Framework2.0
和水晶报表组件等