环境:
windows2003 + vs2005+sqlserver2000
1、
打开
VS2005
,打开工程或网站(这里的示例是一个已发布的网站系统).
2、
从“解决方案资源管理器中”右键点击解决方案名称,选择“添加”――“新建项目”,从打开的“添加新项目”窗口,在“项目类型”栏选择“其他项目类型”――“安装部署”,在模板栏,选“
web
项目”,在下面的名称和地址栏输入名称和地址。
3
、生成
sql
文件(只生成创建数据表的
SQL
语句)
打开
SQLSER
企业管理器,登录,选择数据库――选择要生成
SQL
语句的表,右键――所有任务――生成
SQL
脚本。在打开的窗口中点击“确定”,保存
SQL
脚本(注意:
sql
文件一定要用小写的英文名称命名,保存完成后把
SQL
文件另存为
TXT
文件,并把里面的所有的“
GO
”去掉。)
4
、创建安装程序类库和安装程序类
从“解决方案资源管理器中”右键点击解决方案名称,选择“添加”――“新建项目”,从打开的“添加新项目”窗口,在“项目类型”栏选择“
VISAL BASIC
”,在模板栏,选“类库”,在下面的名称和地址栏输入名称和地址。点击“确定”。
5
、从“解决方案资源管理器中”点击刚生成的类库,删除自动生成的
class1.vb
类,右键点击类库名称――添加――新建项,选择“安装程序类”,输入名称,点击“添加”按钮。
6
、打开刚生成的安装程序类,在
dbtest.vb
中,添加如下代码
Imports
System.ComponentModel
Imports
System.Configuration.Install
Imports
System.IO
Imports
System.Reflection
Public
Class dbtest
'
声明私有变量
Private sqlConnection1 As SqlClient.SqlConnection
Private ServerName As String
Private AdminName As String
Private AdminPwd As String
Public Sub New()
MyBase.New()
'
组件设计器需要此调用。
InitializeComponent()
'
调用 InitializeComponent 后添加初始化代码
End Sub
Private Function GetSql(ByVal Name As String) As String
Try
' Gets the current assembly.
Dim Asm As [Assembly] = [Assembly].GetExecutingAssembly()
' Resources are named using a fully qualified name.
Dim strm As Stream = Asm.GetManifestResourceStream( _
Asm.GetName().Name + "." + Name)
' Reads the contents of the embedded file.
Dim reader As StreamReader = New StreamReader(strm)
Return reader.ReadToEnd()
Catch ex As Exception
MsgBox("
读取SQL文件出错: "
& ex.Message)
Throw ex
End Try
End Function
Private Sub ExecuteSql(ByVal DatabaseName As String, ByVal Sql As String)
Dim Command As New SqlClient.SqlCommand(Sql, sqlConnection1)
Command.Connection.Open()
Command.Connection.ChangeDatabase(DatabaseName)
Try
Command.ExecuteNonQuery()
Finally
' Finally, blocks are a great way to ensure that the connection
' is always closed.
Command.Connection.Close()
End Try
End Sub
Protected Sub AddDBTable()
Try
'
生成数据库
ExecuteSql("master", "CREATE DATABASE water")
'
根据SQL语句生成表
ExecuteSql("water", GetSql("watertable.txt"))
Catch ex As Exception
' Reports any errors and abort.
MsgBox("
生成数据库错误: "
& ex.Message)
Throw ex
End Try
End Sub
Private Sub WriteWebConfig()
'
修改web.config文件
Try
Dim FileInfo As System.IO.FileInfo = New System.IO.FileInfo(Me.Context.Parameters.Item("targetdir") & "\web.config")
If Not FileInfo.Exists Then
Throw New InstallException("
没有找到配置文件"
)
End If
'
实例化xml文档
Dim XmlDocument As New System.Xml.XmlDocument
XmlDocument.Load(FileInfo.FullName)
'
查找到appsettings中的节点
Dim Node As System.Xml.XmlNode
Dim FoundIt As Boolean = False
For Each Node In XmlDocument.Item("configuration").Item("appSettings")
If Node.Name = "add" Then
If Node.Attributes.GetNamedItem("key").Value = "AdoConnBySql" Then
'
写入连接字符串
Node.Attributes.GetNamedItem("value").Value = String.Format("Provider=SQLOLEDB;Data Source={0};Password={2};User ID={1};Initial Catalog=water", Me.Context.Parameters.Item("server"), Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"))
FoundIt = True
End If
End If
Next Node
If Not FoundIt Then
Throw New InstallException("web.Config
文件没有包含connString连接字符串设置"
)
End If
XmlDocument.Save(FileInfo.FullName)
Catch ex As Exception
Throw ex
End Try
End Sub
''' <summary>
'''
安装程序入口
''' </summary>
''' <param name="stateSaver"></param>
''' <remarks></remarks>
Public Overrides Sub Install(ByVal stateSaver As _
System.Collections.IDictionary)
MyBase.Install(stateSaver)
'
读取用户连接数据库信息
ServerName = Trim(Me.Context.Parameters.Item("server"))
AdminName = Trim(Me.Context.Parameters.Item("user"))
AdminPwd = Trim(Me.Context.Parameters.Item("pwd"))
'
根据用户界面输入的信息建立数据库联接
sqlConnection1 = New SqlClient.SqlConnection
sqlConnection1.ConnectionString = "User ID=" + AdminName + ";Data Source = " + ServerName + ";Password=" + AdminPwd + ";Initial Catalog=master"
'sqlConnection1.Open()
'
添加数据库中的表
AddDBTable()
'
修改web.config文件中的数据库连接串
WriteWebConfig()
End Sub
End
Class
6
、添加
SQL
脚本文件到类库中。
右键点击类库名称――添加――现有项,选择
watertable.txt
文件。点击“确定”。
右键选择刚刚添加的
watertable.txt
文件,选“属性”,把“生成操作”项内容修改为“嵌入的资源”。
7
、生成类库的
DLL
文件。
8
、右键安装项目名称――“视图”――“文件系统”,在打开的“文件系统窗口”,右键“
WEB
应用程序文件夹”――“添加”――项目输出,
从“项目”下拉列表框中,选择类库为“主输出”,
重复上步操作,选择网站为“内容文件”
9
、添加安装时用户要输入的数据库服务器名称、用户名、密码的用户界面。
右键安装项目名称――视图――用户界面,在打开的安装界面中,右键“启动”,选择“添加对话框”,在弹出的窗口中,选择“文本框
A
”。
右键文本框
A
,选择“上移”,重复执行,直到在“安装地址”上。
右键“文本框
A
”――属性,进行如下修改。
Edit1lable1
数据库服务器
:
Edit1property DBSERVERNAME
Edit1visible true
Edit2lable1
用户名
:
Edit2property USERNAME
Edit2visible true
Edit3lable1
用户名
:
Edit3property PASSWORD
Edit3visible true
Edit4visible false
10
、添加自定义操作
在“解决方案资源管理器中”,右键安装项目名称――“视图”――“自定义操作”,在打开的自定义操作窗口,右键“安装”――“添加自定义操作”,在打开的“选择项目的项”,双击“
WEB
应用程序文件夹”――主输出来自
clslib(
活动
)
。
右键“主输出来自
clslib(
活动
)
”――“属性窗口”,修改属性
Customactiondata
为
/server=[DBSERVERNAME] /user=[USERNAME] /pwd=[PASSWORD] /targetdir="[TARGETDIR]\"
注意:每个变量之间一定要有一个空格做间隔,如果想得到安装文件在安装机器中的路径,一定要添加
targetdir
变量。
11
、添加系统必备
右键安装项目名称――属性――选择系统必备
在打开的系统必备窗口,选择
“
.net framework 2.0”――选择“从与我的应用程序相同路径下载系统必备”,点击“确定”
12
、生成安装项目。
从菜单“生成”――“生成
websetup
”
,
生成安装项目。
13
、安装项目界面
从“解决方案资源管理器”――安装项目,右键安装项目名称――安装。
生成的数据库
生成的网站
修改后的
web.config
写在后面的话:
做完程序后,发现用
SQLSER
的恢复数据库方法比用
SQL
文件要好的多,也方便的多,就做了一个过程,代码如下:
Private sub RestoreDB()
Dim strdir as string
Dim strSql as string
‘
得到安装程序路径
Strdir=me.context.parameters.item(“targetdir”)
Strsql="RESTORE DATABASE water FROM DISK = '" + strdir + "data.bak' " +
" WITH MOVE 'water_data' TO '" + "c:\water.mdf', " +
" MOVE 'water_log' TO '" + "c:\water_log.ldf' "
Executesql(“master”,strsql)
End sub
注意:
data.bak
是
sqlserver
备份数据库名,也可以没有后缀,如果没有后缀,在程序中也不要有,还有备份文件要和发布的网站文件放在一起,
water_data
、
water_log
是逻辑数据名,在
sqlserver
数据库中的备份恢复中都能查看到的,
TO
后面是把
*.mdf
和
*.ldf
文件复制到一个路径下,直接写死就可以了。
本文转自 牛海彬 51CTO博客,原文链接:http://blog.51cto.com/newhappy/135713,如需转载请自行联系原作者