Asp.net打包部署全攻略(SQL Server2005数据库)

第一次用VS.NET2005打包,和VS.NET2003还是有些区别的。翻箱子倒柜,总算是搞定了。其实很简单,我尽量写的详细点,以后就可以贴过去改改直接用。
一、前期准备
发布网站。准备好要打包的已经发布了的网站。至于怎么发布网站我就不说了,2005中发布网站很方便。
准备好SQL脚步。包括table,view,stroe procedure等。我这里只需要创建一个表和三个存储过程。(注:创建存储过程和表的脚步写到一起会出错,具体原因偶也搞不懂 所以我分开写的)
ContractedBlock.gif ExpandedBlockStart.gif SQL.txt
None.gifIF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Log]'AND type in (N'U'))
None.gif
drop table [dbo].[Log]
None.gif
None.gif
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Log_Pagination]'AND type in (N'P', N'PC'))
None.gif
DROP PROCEDURE [dbo].[Log_Pagination]
None.gif
None.gif
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Log_NoPagination]'AND type in (N'P', N'PC'))
None.gif
DROP PROCEDURE [dbo].[Log_NoPagination]
None.gif
None.gif
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OneLogDetail]'AND type in (N'P', N'PC'))
None.gif
DROP PROCEDURE [dbo].[OneLogDetail]
None.gif
None.gif
CREATE TABLE [dbo].[Log](
None.gif    
[Id] [int] IDENTITY(1,1NOT NULL,
None.gif    
[Date] [datetime] NOT NULL,
None.gif    
[Level] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
None.gif    
[Exception] [varchar](2000) COLLATE Chinese_PRC_CI_AS NULL,
None.gif    
[OutputData] [text] COLLATE Chinese_PRC_CI_AS NULL,
None.gif    
[InputData] [text] COLLATE Chinese_PRC_CI_AS NULL,
None.gif    
[SuccessFlag] [bit] NULL,
None.gif    
[FailureReason] [varchar](2000) COLLATE Chinese_PRC_CI_AS NULL,
None.gif    
[CustomerName] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL
None.gif
ON [PRIMARY]
ContractedBlock.gif ExpandedBlockStart.gif Pagination.txt
None.gifCREATE PROCEDURE [dbo].[Log_Pagination]
None.gif    
@PageSize int = 20,          --record numbers of each page
None.gif
    @PageIndex int = 1,          --current page index
None.gif
    @SuccessFlag varchar(1),     --successflag true/false
None.gif
    @CustomerName varchar (50),  --customer name
None.gif
    @DateFrom varchar(50),       --date range start time
None.gif
    @DateTo varchar(50),         --date range end time
None.gif
    @TotalRows int OUTPUT        --total rows of pagination table
None.gif
AS
None.gif
BEGIN
None.gif    
None.gif    
SET NOCOUNT ON;
None.gif    
None.gif    
DECLARE @SqlCMDString nvarchar(2000)
None.gif    
Begin
None.gif         
select @SqlCMDString ='SELECT @TotalRows=COUNT(*) FROM Log where 1=1' 
None.gif
None.gif       
IF(Cast(@SuccessFlag as varchar(1))!='2')
None.gif         
select @SqlCMDString = @SqlCMDString + ' AND SuccessFlag='+cast(@SuccessFlag as varchar(1))
None.gif       
IF(@CustomerName!='')
None.gif         
select @SqlCMDString = @SqlCMDString + ' AND CustomerName='+''''+@CustomerName+''''+''
None.gif       
IF(@DateFrom!='')
None.gif         
select @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)>='+''''+Convert(varchar(10),@DateFrom,120)+''''+''
None.gif       
IF(@DateTo!='')
None.gif         
select @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)<='+''''+Convert(Varchar(10),@DateTo,120)+''''+'' 
None.gif    
Exec sp_executesql @SqlCMDString,N'@TotalRows int out',@TotalRows out
None.gif    
End
None.gif    
DECLARE @CurrentPageLowerBound int
None.gif
None.gif    
SET @CurrentPageLowerBound = (@PageIndex-1)* @PageSize
None.gif   
None.gif
None.gif    
SET @SqlCMDString = 'SELECT TOP '  + cast(@PageSize As varchar(8))+ ' * FROM Log where 1=1'
None.gif
None.gif    
IF(@PageIndex =1)
None.gif     
BEGIN
None.gif      
IF(Cast(@SuccessFlag as varchar(1))!='2')
None.gif         
SET @SqlCMDString = @SqlCMDString + ' AND SuccessFlag='+cast(@SuccessFlag as varchar(1))
None.gif       
IF(@CustomerName!='')
None.gif         
SET @SqlCMDString = @SqlCMDString + ' AND CustomerName='+''''+@CustomerName+''''+''
None.gif       
IF(@DateFrom!='')
None.gif         
SET @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)>='+''''+Convert(varchar(10),@DateFrom,120)+''''+''
None.gif       
IF(@DateTo!='')
None.gif         
SET @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)<='+''''+Convert(Varchar(10),@DateTo,120)+''''+''  
None.gif
None.gif       
SET @SqlCMDString = @SqlCMDString + ' ORDER BY Id'
None.gif       
Exec sp_executesql @SqlCMDString
None.gif     
END
None.gif    
ELSE
None.gif     
BEGIN
None.gif       
SET @SqlCMDString = @SqlCMDString + ' AND Id > (SELECT max(Id)'
None.gif       
SET @SqlCMDString = @SqlCMDString + ' FROM ( SELECT TOP '+ N'' + cast(@CurrentPageLowerBound As varchar(12)) + ' Id' 
None.gif       
SET @SqlCMDString = @SqlCMDString + ' FROM Log Where 1=1 '
None.gif
None.gif       
IF(Cast(@SuccessFlag as varchar(1))!='2')
None.gif         
SET @SqlCMDString = @SqlCMDString + ' AND SuccessFlag='+cast(@SuccessFlag as varchar(1))
None.gif       
IF(@CustomerName!='')
None.gif         
SET @SqlCMDString = @SqlCMDString + ' AND CustomerName='+''''+@CustomerName+''''+''
None.gif       
IF(@DateFrom!='')
None.gif         
SET @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)>='+''''+Convert(varchar(10),@DateFrom,120)+''''+''
None.gif       
IF(@DateTo!='')
None.gif         
SET @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)<='+''''+Convert(Varchar(10),@DateTo,120)+''''+''  
None.gif
None.gif    
SET @SqlCMDString = @SqlCMDString+'ORDER BY Id ) as temS ) ORDER BY Id'       
None.gif       
--SET @SqlCMDString = @SqlCMDString + ' ) ORDER BY Id'
None.gif
    --print @SqlCMDString
None.gif
       Exec sp_executesql @SqlCMDString
None.gif     
END
None.gif
END
ContractedBlock.gif ExpandedBlockStart.gif NoPagination.txt
None.gifCREATE PROCEDURE [dbo].[Log_NoPagination]
None.gif
None.gif    
@SuccessFlag varchar(1),     --successflag true/false
None.gif
    @CustomerName varchar (50),  --customer name
None.gif
    @DateFrom varchar(50),       --date range start time
None.gif
    @DateTo varchar(50)          --date range end time
None.gif

None.gif
AS
None.gif
BEGIN
None.gif    
None.gif    
SET NOCOUNT ON;
None.gif    
None.gif    
DECLARE @SqlCMDString nvarchar(2000)
None.gif    
select @SqlCMDString ='SELECT* FROM Log where 1=1' 
None.gif
None.gif           
IF(Cast(@SuccessFlag as varchar(1))!='2')
None.gif             
select @SqlCMDString = @SqlCMDString + ' AND SuccessFlag='+cast(@SuccessFlag as varchar(1))
None.gif           
IF(@CustomerName!='')
None.gif             
select @SqlCMDString = @SqlCMDString + ' AND CustomerName='+''''+@CustomerName+''''+''
None.gif           
IF(@DateFrom!='')
None.gif             
select @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)>='+''''+Convert(varchar(10),@DateFrom,120)+''''+''
None.gif           
IF(@DateTo!='')
None.gif             
select @SqlCMDString = @SqlCMDString + ' AND Convert(Varchar(10),Date,120)<='+''''+Convert(Varchar(10),@DateTo,120)+''''+''      
None.gif          
SET @SqlCMDString = @SqlCMDString + ' ORDER BY Id'
None.gif        
None.gif    
Exec sp_executesql @SqlCMDString
None.gif
None.gif
END
ContractedBlock.gif ExpandedBlockStart.gif OneLogDetail.txt
None.gifCreate PROCEDURE [dbo].[OneLogDetail]
None.gif    
@Id int            --Log Id
None.gif

None.gif
AS
None.gif
BEGIN
None.gif    
SELECT OutputData,InputData from Log WHERE Id=@Id
None.gif
END
二、Installer类
添加一个项目DBInstall,在项目中添加一个新项,选择Installer class 取名DBInstaller.cs 具体实现如下:
ContractedBlock.gif ExpandedBlockStart.gif DBInstaller.cs
  1None.gifusing System;
  2None.gifusing System.IO;
  3None.gifusing System.Reflection;
  4None.gifusing System.Data.SqlClient;
  5None.gifusing System.Collections.Generic;
  6None.gifusing System.ComponentModel;
  7None.gifusing System.Configuration.Install;
  8None.gifusing System.Xml;
  9None.gifusing Microsoft.Win32;
 10None.gifusing System.Security.AccessControl;
 11None.gif
 12None.gifnamespace DBInstall
 13ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 14InBlock.gif    [RunInstaller(true)]
 15InBlock.gif    public partial class DBInstaller : Installer
 16ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 17InBlock.gif        //The const string used to fix the database connection(Windows Authentication)
 18InBlock.gif        //private const string connectionString = "Data Source= 127.0.0.1;Initial Catalog= master;Integrated Security = SSPI";
 19InBlock.gif        private string connectionString;
 20InBlock.gif
 21InBlock.gif        //An SqlConnection used to connect the SqlServer
 22InBlock.gif        private System.Data.SqlClient.SqlConnection masterConnection;
 23InBlock.gif        public DBInstaller()
 24ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 25InBlock.gif            InitializeComponent();
 26ExpandedSubBlockEnd.gif        }

 27InBlock.gif        //private void GetSql(string name)
 28InBlock.gif        //{
 29InBlock.gif        //    System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();
 30InBlock.gif
 31InBlock.gif        //    sqlProcess.StartInfo.FileName = "osql.exe";
 32InBlock.gif
 33InBlock.gif        //    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"]);
 34InBlock.gif
 35InBlock.gif        //    sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
 36InBlock.gif
 37InBlock.gif        //    sqlProcess.Start();
 38InBlock.gif
 39InBlock.gif        //    sqlProcess.WaitForExit();//等待执行
 40InBlock.gif
 41InBlock.gif        //    sqlProcess.Close();
 42InBlock.gif        //    Gets the current assembly.
 43InBlock.gif        //    //Assembly Asm = Assembly.GetExecutingAssembly();
 44InBlock.gif
 45InBlock.gif        //    Resources are named using a fully qualified name.
 46InBlock.gif        //    //Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + name);
 47InBlock.gif
 48InBlock.gif        //    Reads the contents of the embedded file.
 49InBlock.gif        //    //StreamReader reader = new StreamReader(strm);
 50InBlock.gif        //    //return reader.ReadToEnd();
 51InBlock.gif
 52InBlock.gif        //}
 53InBlock.gif        private string GetSql(string name)
 54ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 55InBlock.gif            try
 56ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 57InBlock.gif                //Gets the current assembly.
 58InBlock.gif                Assembly Asm = Assembly.GetExecutingAssembly();
 59InBlock.gif
 60InBlock.gif                //Resources are named using a fully qualified name.
 61InBlock.gif                Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + name);
 62InBlock.gif
 63InBlock.gif                //Reads the contents of the embedded file.
 64InBlock.gif                StreamReader reader = new StreamReader(strm);
 65InBlock.gif                return reader.ReadToEnd();
 66ExpandedSubBlockEnd.gif            }

 67ExpandedSubBlockStart.gifContractedSubBlock.gif            finally dot.gif{ }
 68ExpandedSubBlockEnd.gif        }

 69InBlock.gif
 70InBlock.gif        private void ExecuteSql(string dbName, string sql)
 71ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 72InBlock.gif            
 73InBlock.gif            //Initialize the connection, open it, and set it to the "master" database
 74InBlock.gif            masterConnection = new System.Data.SqlClient.SqlConnection(connectionString);            
 75InBlock.gif
 76InBlock.gif            //An instance of SqlCommand to realize the StrCommand
 77InBlock.gif            System.Data.SqlClient.SqlCommand command = new SqlCommand(sql, masterConnection);
 78InBlock.gif
 79InBlock.gif            if (masterConnection.State == System.Data.ConnectionState.Closed)
 80ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 81InBlock.gif                masterConnection.Open();
 82ExpandedSubBlockEnd.gif            }

 83InBlock.gif
 84InBlock.gif            command.Connection.ChangeDatabase(dbName);
 85InBlock.gif
 86InBlock.gif            try
 87ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 88InBlock.gif                command.ExecuteNonQuery();
 89ExpandedSubBlockEnd.gif            }

 90InBlock.gif            finally
 91ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 92InBlock.gif                //Closing the connection should be done in a Finally block
 93InBlock.gif                command.Connection.Close();
 94ExpandedSubBlockEnd.gif            }

 95ExpandedSubBlockEnd.gif        }

 96InBlock.gif
 97InBlock.gif        private void WriteWebConfig()
 98ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 99InBlock.gif            try
100ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
101InBlock.gif                FileInfo fileInfo = new FileInfo(this.Context.Parameters["targetdir"+ @"\web.config");
102InBlock.gif                if (!fileInfo.Exists)
103InBlock.gif                    throw new InstallException("Did not find config file");
104InBlock.gif
105InBlock.gif                //Instantiate xml
106InBlock.gif                XmlDocument xmlDoc = new XmlDocument();
107InBlock.gif                xmlDoc.Load(fileInfo.FullName);
108InBlock.gif
109InBlock.gif                //Find appsettings node
110InBlock.gif                bool foundIt = false;
111InBlock.gif                foreach (XmlNode node in xmlDoc.DocumentElement.SelectNodes("//connectionStrings/add"))
112ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
113InBlock.gif                    if (node.Name == "add")
114ExpandedSubBlockStart.gifContractedSubBlock.gif                    dot.gif{
115InBlock.gif                        if (node.Attributes.GetNamedItem("name").Value == "ExperianConnectionString")
116InBlock.gif                            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",
117InBlock.gif                                this.Context.Parameters["server"], this.Context.Parameters["user"], this.Context.Parameters["password"]);
118InBlock.gif                        foundIt = true;
119ExpandedSubBlockEnd.gif                    }

120ExpandedSubBlockEnd.gif                }

121InBlock.gif                if (foundIt == false)
122InBlock.gif                    throw new InstallException("web.config does not contains configSections");
123InBlock.gif                xmlDoc.Save(fileInfo.FullName);
124ExpandedSubBlockEnd.gif            }

125InBlock.gif            catch (Exception ex)
126ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
127InBlock.gif                throw ex;
128ExpandedSubBlockEnd.gif            }

129ExpandedSubBlockEnd.gif        }

130InBlock.gif
131InBlock.gif        private void SettingDirectoryPopedom()
132ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
133InBlock.gif            // Create a new DirectoryInfo object.
134InBlock.gif            DirectoryInfo dInfo = new DirectoryInfo(this.Context.Parameters["targetdir"+ @"\XmlFiles");
135InBlock.gif
136InBlock.gif            // Get a DirectorySecurity object that represents the 
137InBlock.gif            // current security settings.
138InBlock.gif            DirectorySecurity dSecurity = dInfo.GetAccessControl();
139InBlock.gif
140InBlock.gif            // Add the FileSystemAccessRule to the security settings. 
141InBlock.gif            dSecurity.AddAccessRule(new FileSystemAccessRule("everyone", FileSystemRights.Modify, AccessControlType.Allow));
142InBlock.gif
143InBlock.gif            // Set the new access settings.
144InBlock.gif            dInfo.SetAccessControl(dSecurity);
145InBlock.gif
146ExpandedSubBlockEnd.gif        }

147InBlock.gif
148InBlock.gif
149InBlock.gif        protected void AddDBTable(string strDBName)
150ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
151InBlock.gif            try
152ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
153InBlock.gif                //Creates the database.
154InBlock.gif                ExecuteSql("MASTER""IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'"
155InBlock.gif                        + strDBName + "') CREATE DATABASE " + strDBName);
156InBlock.gif
157InBlock.gif                //Creates the tables.                
158InBlock.gif                ExecuteSql(strDBName, GetSql("SQL.txt"));
159InBlock.gif                ExecuteSql(strDBName, GetSql("Pagination.txt"));
160InBlock.gif                ExecuteSql(strDBName, GetSql("NoPagination.txt"));
161InBlock.gif                ExecuteSql(strDBName, GetSql("OneLogDetail.txt"));
162InBlock.gif                
163ExpandedSubBlockEnd.gif            }

164ExpandedSubBlockStart.gifContractedSubBlock.gif            finally dot.gif{ }
165ExpandedSubBlockEnd.gif        }

166InBlock.gif
167InBlock.gif        public override void Install(System.Collections.IDictionary stateSaver)
168ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
169InBlock.gif            base.Install(stateSaver);
170InBlock.gif
171InBlock.gif            string server, user, password;
172InBlock.gif            server = this.Context.Parameters["server"];
173InBlock.gif            user = this.Context.Parameters["user"];
174InBlock.gif            password = this.Context.Parameters["password"];
175InBlock.gif
176InBlock.gif            connectionString = "Data Source= "+server+";Initial Catalog= master;User Id ="+user+"; Password = "+password;
177InBlock.gif
178InBlock.gif            //Create database "EXPERIANSERVER"
179InBlock.gif            AddDBTable("EXPERIANSERVER");
180InBlock.gif            //Config web.config.
181InBlock.gif            WriteWebConfig();
182InBlock.gif            //Setting directory's popedom
183InBlock.gif            SettingDirectoryPopedom();
184ExpandedSubBlockEnd.gif        }

185InBlock.gif
186InBlock.gif        public override void Uninstall(System.Collections.IDictionary savedState)
187ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
188InBlock.gif            base.Uninstall(savedState);
189InBlock.gif
190InBlock.gif            //Drop the database
191InBlock.gif            //string strDelTable = "IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'EXPERIANSERVER') DROP DATABASE EXPERIANSERVER";
192InBlock.gif            //ExecuteSql("MASTER", strDelTable);
193ExpandedSubBlockEnd.gif        }

194ExpandedSubBlockEnd.gif    }

195ExpandedBlockEnd.gif}
然后把刚才写的几个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)设置如下:


这里的几个EditProperty后面会用到,可以根据自己的需要来设置。它们分别对应DBInstall.cs 中的this.Context.Parameters["server"],this.Context.Parameters["user"],this.Context.Parameters["password"]。
添加Customer Actions:右键点击LogPresent选择view-Customer Actions, 在Install中添加一个DBInstall主输出

然后,设置这个主输出的CustomerActionData属性为:
/server=[EDITA1] /user=[EDITA2] /password=[EDITA3] /targetdir="[TARGETDIR]\"(注:这里用到了之前在Textboxs A 中设置的几个参数 /targetdir="[TARGETDIR]\"用来获取服务器应用程序地址,在配置web.config时会用到)。


四、卸载程序
卸载可以参加 http://www.cnblogs.com/syringa-flz/archive/2006/10/28/542579.html 不多说了。
好,一切搞定,编译以后安装包可用。其实还是很简单的。

转载于:https://www.cnblogs.com/syringa-flz/archive/2007/07/13/816957.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值