Asp.net打包部署全攻略(SQL Server2005数据库)
Asp.net打包部署全攻略(SQL Server2005数据库)
第一次用VS.NET2005打包,和VS.NET2003还是有些区别的。翻箱子倒柜,总算是搞定了。其实很简单,我尽量写的详细点,以后就可以贴过去改改直接用。
一、前期准备
发布网站。准备好要打包的已经发布了的网站。至于怎么发布网站我就不说了,2005中发布网站很方便。
准备好SQL脚步。包括table,view,stroe procedure等。我这里只需要创建一个表和三个存储过程。(注:创建存储过程和表的脚步写到一起会出错,具体原因偶也搞不懂 所以我分开写的)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
SQL.txt
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Log]') AND type in (N'U'))
drop table [dbo].[Log]
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Log_Pagination]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Log_Pagination]
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Log_NoPagination]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Log_NoPagination]
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OneLogDetail]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[OneLogDetail]
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
CREATE TABLE [dbo].[Log](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Date] [datetime] NOT NULL,
[Level] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Exception] [varchar](2000) COLLATE Chinese_PRC_CI_AS NULL,
[OutputData] [text] COLLATE Chinese_PRC_CI_AS NULL,
[InputData] [text] COLLATE Chinese_PRC_CI_AS NULL,
[SuccessFlag] [bit] NULL,
[FailureReason] [varchar](2000) COLLATE Chinese_PRC_CI_AS NULL,
[CustomerName] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Pagination.txt
CREATE PROCEDURE [dbo].[Log_Pagination]
@PageSize int = 20, --record numbers of each page
@PageIndex int = 1, --current page index
@SuccessFlag varchar(1), --successflag true/false
@CustomerName varchar (50), --customer name
@DateFrom varchar(50), --date range start time
@DateTo varchar(50), --date range end time
@TotalRows int OUTPUT --total rows of pagination table
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SqlCMDString nvarchar(2000)
Begin
select @SqlCMDString ='SELECT @TotalRows=COUNT(*) FROM Log where 1=1'
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
IF(Cast(@SuccessFlag as varchar(1))!='2')
select @SqlCMDString = @SqlCMDString + ' AND SuccessFlag='+cast(@SuccessFlag as varchar(1))
IF(@CustomerName!='')
select @SqlCMDString = @SqlCMDString + ' AND CustomerName='+''''+@CustomerName+''''+''
IF(@DateFrom!='')
select @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)>='+''''+Convert(varchar(10),@DateFrom,120)+''''+''
IF(@DateTo!='')
select @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)<='+''''+Convert(Varchar(10),@DateTo,120)+''''+''
Exec sp_executesql @SqlCMDString,N'@TotalRows int out',@TotalRows out
End
DECLARE @CurrentPageLowerBound int
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SET @CurrentPageLowerBound = (@PageIndex-1)* @PageSize
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SET @SqlCMDString = 'SELECT TOP ' + cast(@PageSize As varchar(8))+ ' * FROM Log where 1=1'
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
IF(@PageIndex =1)
BEGIN
IF(Cast(@SuccessFlag as varchar(1))!='2')
SET @SqlCMDString = @SqlCMDString + ' AND SuccessFlag='+cast(@SuccessFlag as varchar(1))
IF(@CustomerName!='')
SET @SqlCMDString = @SqlCMDString + ' AND CustomerName='+''''+@CustomerName+''''+''
IF(@DateFrom!='')
SET @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)>='+''''+Convert(varchar(10),@DateFrom,120)+''''+''
IF(@DateTo!='')
SET @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)<='+''''+Convert(Varchar(10),@DateTo,120)+''''+''
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SET @SqlCMDString = @SqlCMDString + ' ORDER BY Id'
Exec sp_executesql @SqlCMDString
END
ELSE
BEGIN
SET @SqlCMDString = @SqlCMDString + ' AND Id > (SELECT max(Id)'
SET @SqlCMDString = @SqlCMDString + ' FROM ( SELECT TOP '+ N'' + cast(@CurrentPageLowerBound As varchar(12)) + ' Id'
SET @SqlCMDString = @SqlCMDString + ' FROM Log Where 1=1 '
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
IF(Cast(@SuccessFlag as varchar(1))!='2')
SET @SqlCMDString = @SqlCMDString + ' AND SuccessFlag='+cast(@SuccessFlag as varchar(1))
IF(@CustomerName!='')
SET @SqlCMDString = @SqlCMDString + ' AND CustomerName='+''''+@CustomerName+''''+''
IF(@DateFrom!='')
SET @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)>='+''''+Convert(varchar(10),@DateFrom,120)+''''+''
IF(@DateTo!='')
SET @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)<='+''''+Convert(Varchar(10),@DateTo,120)+''''+''
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
SET @SqlCMDString = @SqlCMDString+'ORDER BY Id ) as temS ) ORDER BY Id'
--SET @SqlCMDString = @SqlCMDString + ' ) ORDER BY Id'
--print @SqlCMDString
Exec sp_executesql @SqlCMDString
END
END
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
NoPagination.txt
CREATE PROCEDURE [dbo].[Log_NoPagination]
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
@SuccessFlag varchar(1), --successflag true/false
@CustomerName varchar (50), --customer name
@DateFrom varchar(50), --date range start time
@DateTo varchar(50) --date range end time
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SqlCMDString nvarchar(2000)
select @SqlCMDString ='SELECT* FROM Log where 1=1'
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
IF(Cast(@SuccessFlag as varchar(1))!='2')
select @SqlCMDString = @SqlCMDString + ' AND SuccessFlag='+cast(@SuccessFlag as varchar(1))
IF(@CustomerName!='')
select @SqlCMDString = @SqlCMDString + ' AND CustomerName='+''''+@CustomerName+''''+''
IF(@DateFrom!='')
select @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)>='+''''+Convert(varchar(10),@DateFrom,120)+''''+''
IF(@DateTo!='')
select @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)<='+''''+Convert(Varchar(10),@DateTo,120)+''''+''
SET @SqlCMDString = @SqlCMDString + ' ORDER BY Id'
Exec sp_executesql @SqlCMDString
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
END
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
OneLogDetail.txt
Create PROCEDURE [dbo].[OneLogDetail]
@Id int --Log Id
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
AS
BEGIN
SELECT OutputData,InputData from Log WHERE Id=@Id
END
二、Installer类
添加一个项目DBInstall,在项目中添加一个新项,选择Installer class 取名DBInstaller.cs 具体实现如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
DBInstaller.cs
1
using System;
2
using System.IO;
3
using System.Reflection;
4
using System.Data.SqlClient;
5
using System.Collections.Generic;
6
using System.ComponentModel;
7
using System.Configuration.Install;
8
using System.Xml;
9
using Microsoft.Win32;
10
using System.Security.AccessControl;
11![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
namespace DBInstall
13![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
14
[RunInstaller(true)]
15
public partial class DBInstaller : Installer
16![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
17
//The const string used to fix the database connection(Windows Authentication)
18
//private const string connectionString = "Data Source= 127.0.0.1;Initial Catalog= master;Integrated Security = SSPI";
19
private string connectionString;
20![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
//An SqlConnection used to connect the SqlServer
22
private System.Data.SqlClient.SqlConnection masterConnection;
23
public DBInstaller()
24![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
25
InitializeComponent();
26
}
27
//private void GetSql(string name)
28
//{
29
// System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();
30![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
// sqlProcess.StartInfo.FileName = "osql.exe";
32![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
// sqlProcess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -d {2} -i {3}SQL.sql", this.Context.Parameters["user"], this.Context.Parameters["password"], "master", this.Context.Parameters["targetdir"]);
34![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
// sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
36![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
// sqlProcess.Start();
38![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
// sqlProcess.WaitForExit();//等待执行
40![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
// sqlProcess.Close();
42
// ////Gets the current assembly.
43
// //Assembly Asm = Assembly.GetExecutingAssembly();
44![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
// ////Resources are named using a fully qualified name.
46
// //Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + name);
47![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
48
// ////Reads the contents of the embedded file.
49
// //StreamReader reader = new StreamReader(strm);
50
// //return reader.ReadToEnd();
51![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
52
//}
53
private string GetSql(string name)
54![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
55
try
56![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
57
//Gets the current assembly.
58
Assembly Asm = Assembly.GetExecutingAssembly();
59![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
60
//Resources are named using a fully qualified name.
61
Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + name);
62![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
63
//Reads the contents of the embedded file.
64
StreamReader reader = new StreamReader(strm);
65
return reader.ReadToEnd();
66
}
67![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
finally
{ }
68
}
69![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
70
private void ExecuteSql(string dbName, string sql)
71![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
72
73
//Initialize the connection, open it, and set it to the "master" database
74
masterConnection = new System.Data.SqlClient.SqlConnection(connectionString);
75![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
76
//An instance of SqlCommand to realize the StrCommand
77
System.Data.SqlClient.SqlCommand command = new SqlCommand(sql, masterConnection);
78![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
79
if (masterConnection.State == System.Data.ConnectionState.Closed)
80![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
81
masterConnection.Open();
82
}
83![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
84
command.Connection.ChangeDatabase(dbName);
85![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
86
try
87![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
88
command.ExecuteNonQuery();
89
}
90
finally
91![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
92
//Closing the connection should be done in a Finally block
93
command.Connection.Close();
94
}
95
}
96![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
97
private void WriteWebConfig()
98![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
99
try
100![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
101
FileInfo fileInfo = new FileInfo(this.Context.Parameters["targetdir"] + @"\web.config");
102
if (!fileInfo.Exists)
103
throw new InstallException("Did not find config file");
104![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
105
//Instantiate xml
106
XmlDocument xmlDoc = new XmlDocument();
107
xmlDoc.Load(fileInfo.FullName);
108![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
109
//Find appsettings node
110
bool foundIt = false;
111
foreach (XmlNode node in xmlDoc.DocumentElement.SelectNodes("//connectionStrings/add"))
112![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
113
if (node.Name == "add")
114![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
115
if (node.Attributes.GetNamedItem("name").Value == "ExperianConnectionString")
116
node.Attributes.GetNamedItem("connectionString").Value = String.Format("Persist Security Info=True;Data Source={0};Initial Catalog=ExperianServer;User ID={1};Password={2};Packet Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1",
117
this.Context.Parameters["server"], this.Context.Parameters["user"], this.Context.Parameters["password"]);
118
foundIt = true;
119
}
120
}
121
if (foundIt == false)
122
throw new InstallException("web.config does not contains configSections");
123
xmlDoc.Save(fileInfo.FullName);
124
}
125
catch (Exception ex)
126![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
127
throw ex;
128
}
129
}
130![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
131
private void SettingDirectoryPopedom()
132![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
133
// Create a new DirectoryInfo object.
134
DirectoryInfo dInfo = new DirectoryInfo(this.Context.Parameters["targetdir"] + @"\XmlFiles");
135![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
136
// Get a DirectorySecurity object that represents the
137
// current security settings.
138
DirectorySecurity dSecurity = dInfo.GetAccessControl();
139![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
140
// Add the FileSystemAccessRule to the security settings.
141
dSecurity.AddAccessRule(new FileSystemAccessRule("everyone", FileSystemRights.Modify, AccessControlType.Allow));
142![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
143
// Set the new access settings.
144
dInfo.SetAccessControl(dSecurity);
145![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
146
}
147![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
148![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
149
protected void AddDBTable(string strDBName)
150![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
151
try
152![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
153
//Creates the database.
154
ExecuteSql("MASTER", "IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'"
155
+ strDBName + "') CREATE DATABASE " + strDBName);
156![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
157
//Creates the tables.
158
ExecuteSql(strDBName, GetSql("SQL.txt"));
159
ExecuteSql(strDBName, GetSql("Pagination.txt"));
160
ExecuteSql(strDBName, GetSql("NoPagination.txt"));
161
ExecuteSql(strDBName, GetSql("OneLogDetail.txt"));
162
163
}
164![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
finally
{ }
165
}
166![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
167
public override void Install(System.Collections.IDictionary stateSaver)
168![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
169
base.Install(stateSaver);
170![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
171
string server, user, password;
172
server = this.Context.Parameters["server"];
173
user = this.Context.Parameters["user"];
174
password = this.Context.Parameters["password"];
175![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
176
connectionString = "Data Source= "+server+";Initial Catalog= master;User Id ="+user+"; Password = "+password;
177![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
178
//Create database "EXPERIANSERVER"
179
AddDBTable("EXPERIANSERVER");
180
//Config web.config.
181
WriteWebConfig();
182
//Setting directory's popedom
183
SettingDirectoryPopedom();
184
}
185![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
186
public override void Uninstall(System.Collections.IDictionary savedState)
187![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
188
base.Uninstall(savedState);
189![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
190
//Drop the database
191
//string strDelTable = "IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'EXPERIANSERVER') DROP DATABASE EXPERIANSERVER";
192
//ExecuteSql("MASTER", strDelTable);
193
}
194
}
195
}
然后把刚才写的几个SQL文本添加到该项目中,并且设置几个文本的Build Action属性为Embedded Resource
(注:这一步是必须的)
一切搞定之后,将DBInstall编译一次。
三、Web Setup Project
添加安装项目:在解决方案中添加一个Web Setup Project。我这里取名LogPresent
添加主输出:右键点击LogPresent选择添加-主输出(Project Outpu...),然后选择DBInstall的主输出(Primary Output)
添加项目文件:右键点击LogPresent选择视图-文件系统(File System)把发布好的网站所有文件夹文件拖放到Web Application Folder中。具体怎么拖不讲了,多试几次就知道。
添加数据库连接信息录入框:右键点击LogPresent选择视图-用户界面(User Interface),在Start下面添加一个文本框A(Textboxs A)设置如下:
![](https://www.cnblogs.com/images/cnblogs_com/syringa-flz/log1.jpg)
这里的几个EditProperty后面会用到,可以根据自己的需要来设置。它们分别对应DBInstall.cs 中的this.Context.Parameters["server"],this.Context.Parameters["user"],this.Context.Parameters["password"]。
添加Customer Actions:右键点击LogPresent选择view-Customer Actions, 在Install中添加一个DBInstall主输出
![](https://www.cnblogs.com/images/cnblogs_com/syringa-flz/log2.jpg)
然后,设置这个主输出的CustomerActionData属性为:
/server=[EDITA1] /user=[EDITA2] /password=[EDITA3] /targetdir="[TARGETDIR]\"(注:这里用到了之前在Textboxs A 中设置的几个参数 /targetdir="[TARGETDIR]\"用来获取服务器应用程序地址,在配置web.config时会用到)。
![](https://www.cnblogs.com/images/cnblogs_com/syringa-flz/log3.jpg)
四、卸载程序
卸载可以参加http://www.cnblogs.com/syringa-flz/archive/2006/10/28/542579.html 不多说了。
好,一切搞定,编译以后安装包可用。其实还是很简单的。
一、前期准备
发布网站。准备好要打包的已经发布了的网站。至于怎么发布网站我就不说了,2005中发布网站很方便。
准备好SQL脚步。包括table,view,stroe procedure等。我这里只需要创建一个表和三个存储过程。(注:创建存储过程和表的脚步写到一起会出错,具体原因偶也搞不懂 所以我分开写的)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
添加一个项目DBInstall,在项目中添加一个新项,选择Installer class 取名DBInstaller.cs 具体实现如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
1
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
40
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
42
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
43
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
44
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
46
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
48
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
50
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
51
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
52
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
53
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
54
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
55
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
56
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
57
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
58
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
59
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
60
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
61
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
62
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
63
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
64
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
65
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
66
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
67
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
68
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
69
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
70
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
71
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
72
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
73
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
74
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
75
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
76
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
77
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
78
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
79
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
80
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
81
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
82
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
83
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
84
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
85
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
86
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
87
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
88
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
89
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
90
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
91
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
92
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
93
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
94
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
95
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
96
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
97
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
98
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
99
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
100
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
101
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
102
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
103
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
104
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
105
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
106
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
107
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
108
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
109
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
110
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
111
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
112
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
113
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
114
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
115
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
116
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
117
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
118
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
119
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
120
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
121
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
122
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
123
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
124
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
125
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
126
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
127
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
128
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
129
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
130
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
131
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
132
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
133
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
134
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
135
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
136
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
137
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
138
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
139
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
140
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
141
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
142
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
143
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
144
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
145
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
146
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
147
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
148
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
149
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
150
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
151
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
152
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
153
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
154
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
155
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
156
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
157
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
158
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
159
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
160
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
161
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
162
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
163
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
164
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
165
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
166
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
167
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
168
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
169
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
170
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
171
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
172
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
173
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
174
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
175
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
176
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
177
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
178
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
179
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
180
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
181
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
182
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
183
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
184
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
185
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
186
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
187
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
188
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
189
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
190
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
191
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
192
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
193
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
194
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
195
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
(注:这一步是必须的)
一切搞定之后,将DBInstall编译一次。
三、Web Setup Project
添加安装项目:在解决方案中添加一个Web Setup Project。我这里取名LogPresent
添加主输出:右键点击LogPresent选择添加-主输出(Project Outpu...),然后选择DBInstall的主输出(Primary Output)
添加项目文件:右键点击LogPresent选择视图-文件系统(File System)把发布好的网站所有文件夹文件拖放到Web Application Folder中。具体怎么拖不讲了,多试几次就知道。
添加数据库连接信息录入框:右键点击LogPresent选择视图-用户界面(User Interface),在Start下面添加一个文本框A(Textboxs A)设置如下:
![](https://www.cnblogs.com/images/cnblogs_com/syringa-flz/log1.jpg)
这里的几个EditProperty后面会用到,可以根据自己的需要来设置。它们分别对应DBInstall.cs 中的this.Context.Parameters["server"],this.Context.Parameters["user"],this.Context.Parameters["password"]。
添加Customer Actions:右键点击LogPresent选择view-Customer Actions, 在Install中添加一个DBInstall主输出
![](https://www.cnblogs.com/images/cnblogs_com/syringa-flz/log2.jpg)
然后,设置这个主输出的CustomerActionData属性为:
/server=[EDITA1] /user=[EDITA2] /password=[EDITA3] /targetdir="[TARGETDIR]\"(注:这里用到了之前在Textboxs A 中设置的几个参数 /targetdir="[TARGETDIR]\"用来获取服务器应用程序地址,在配置web.config时会用到)。
![](https://www.cnblogs.com/images/cnblogs_com/syringa-flz/log3.jpg)
四、卸载程序
卸载可以参加http://www.cnblogs.com/syringa-flz/archive/2006/10/28/542579.html 不多说了。
好,一切搞定,编译以后安装包可用。其实还是很简单的。