你知道VB.NET安裝工程怎么實(shí)現(xiàn)
寫(xiě)了很多關(guān)于VB.NET的代碼了,在這里給大家提供一個(gè)VB.NET安裝工程的技巧,希望大家可以從中找到價(jià)值。
#T#首先,是制作一個(gè)類(lèi)VB.NET安裝工程。然后添加一個(gè)安裝類(lèi)文件,并添加一個(gè)SQL.TXT文件,當(dāng)作嵌入的資源,類(lèi)的代碼如下,在后面再做說(shuō)明。VB.NET安裝工程代碼:
- Dim Cn As SqlConnection
- '得到SQL腳本字符串
- Private Function GetSql(ByVal Name As String) As String
- Try
- '通過(guò)反射取到程序集
- Dim Asm As [Assembly] = [Assembly].GetExecutingAssembly()
- '讀取資源文件資料,要將資源文件在編譯時(shí)設(shè)成嵌入的資源
- Dim Sm As Stream = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + Name)
- Dim Rr As New StreamReader(Sm)
- Return Rr.ReadToEnd
- Catch ex As Exception
- MsgBox(Err.Description, MsgBoxStyle.OKOnly, "出錯(cuò)提示")
- Throw ex
- End Try
- End Function
- '得到數(shù)據(jù)庫(kù)備份文件路徑
- Private Function GetBakFilePath(ByVal DatFileName As String) As String
- Try
- '通過(guò)反射取到程序集
- Dim Asm As [Assembly] = [Assembly].GetExecutingAssembly()
- '讀取資源文件資料,要將資源文件在編譯時(shí)設(shè)成嵌入的資源
- Dim Sm As Stream = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + DatFileName)
- If File.Exists("c:\" & DatFileName) Then
- File.Delete("c:\" & DatFileName)
- End If
- Dim Fs As New FileStream("c:\" & DatFileName, FileMode.Create)
- Dim Sw As New BinaryWriter(Fs)
- Dim recbyte(Sm.Length - 1) As Byte
- Dim strread As New BinaryReader(Sm)
- strread.Read(recbyte, 0, recbyte.Length)
- Sw.Write(recbyte, 0, recbyte.Length)
- Sw.Close()
- Fs.Close()
- Return "C:\" & DatFileName
- Catch ex As Exception
- MsgBox(Err.Description, MsgBoxStyle.OKOnly, "出錯(cuò)提示")
- Throw ex
- End Try
- End Function
- Private Sub ExecuteSql(ByVal DbName As String, ByVal SqlText As String, ByVal uid As String, ByVal pwd As String, ByVal servername As String)
- Dim cmd As New SqlCommand(SqlText, Cn)
- If Cn.State = ConnectionState.Closed Then Cn.Open()
- Try
- Cn.ChangeDatabase(DbName)
- cmd.ExecuteNonQuery()
- Catch ex As Exception
- MsgBox("運(yùn)行SQL腳本出錯(cuò)!", MsgBoxStyle.OKOnly, "提示")
- Throw ex
- End Try
- Cn.Close()
- End Sub
- Protected Sub AddDBTable(ByVal DBName As String, ByVal uid As String, ByVal pwd As String, ByVal servername As String)
- '判斷數(shù)據(jù)庫(kù)是否存在
- Try
- Cn = New SqlConnection("Persist Security Info=False;User ID=" & uid & ";Initial Catalog=master;Data Source=" & servername & ";password=" & pwd & ";Max Pool Size=75000")
- Dim Dt As New DataTable()
- Cn.Open()
- Dim cmd As New SqlDataAdapter()
- cmd.SelectCommand = New SqlCommand("exec sp_helpdb", Cn)
- cmd.Fill(Dt)
- Dim i As Int16
- For i = 0 To Dt.Rows.Count - 1
- If DBName.ToLower = CType(Dt.Rows(i).Item(0), String).ToLower Then
- '數(shù)據(jù)庫(kù)存在
- cmd = Nothing
- Cn.Close()
- Exit Sub
- End If
- Next
- Catch ex As Exception
- MsgBox(Err.Description & "連接數(shù)據(jù)庫(kù)出錯(cuò),請(qǐng)檢查所輸入的參數(shù)是否正確!", MsgBoxStyle.OKOnly, "出錯(cuò)提示")
- Exit Sub '如已存在則跳出
- End Try
- Try
- '========方法一:運(yùn)行SQL腳本創(chuàng)建數(shù)據(jù)庫(kù)
- ' ExecuteSql("Master", "Create DataBase " & DBName, uid, pwd, servername)
- 'ExecuteSql(DBName, GetSql("mySql.txt"), uid, pwd, servername)
- '========方法二:執(zhí)行還原備份文件
- Dim cm As New ADODB.Command()
- Dim cn As New ADODB.Connection()
- Dim dbrs As New ADODB.Recordset()
- cn.Open("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" & uid & ";Initial Catalog=master;Data Source=" & servername & ";password=" & pwd)
- cm.ActiveConnection = cn
- '判斷該數(shù)據(jù)是否存在,存在就刪除
- cm.CommandText = "exec sp_helpdb"
- dbrs = cm.Execute() '取所有數(shù)據(jù)庫(kù)名
- If Not dbrs.BOF And Not dbrs.EOF Then
- Do While Not dbrs.EOF
- If Trim(dbrs.Fields(0).Value) = Trim(DBName) Then '如果該數(shù)據(jù)庫(kù)存
- cm.CommandText = "drop database " & Trim(DBName)
- cm.Execute()
- Exit Do
- End If
- dbrs.MoveNext()
- Loop
- End If
- 'dbrs.Close()
- Dim Sfile As String = GetBakFilePath("installdb.dat")
- cm.CommandText = "restore database " & Trim(DBName) & " from DISK='" & Trim(Sfile) & "'"
- cm.Execute()
- cn.Close()
- If File.Exists(Sfile) Then
- File.Delete(Sfile)
- End If
- Catch ex As Exception
- MsgBox(Err.Description & "A", MsgBoxStyle.OKOnly, "出錯(cuò)提示")
- Throw ex
- End Try
- End Sub
- '覆寫(xiě)安裝方法
- Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
- MyBase.Install(stateSaver)
- '取安裝程序中用戶(hù)界面中添回的文本框中的參數(shù)值
- Dim Connstr As String = Me.Context.Parameters.Item("dbname")
- Dim Cs As String() = Split(Connstr, "|")
- AddDBTable(Cs(0), Cs(1), Cs(2), Cs(3))
- End Sub
然后添加一個(gè)VB.NET安裝工程,將上面的類(lèi)的工程做為項(xiàng)目主輸出添進(jìn)來(lái).在用戶(hù)界面中加一個(gè)文本框,然后在文本框的四個(gè)屬性中輸入?yún)?shù)名稱(chēng)..這里設(shè)置了四個(gè)參數(shù),在安裝運(yùn)行的時(shí)候,會(huì)有界面讓你輸入四個(gè)參數(shù),在自定義操作里的安裝項(xiàng)目上,將所加載進(jìn)來(lái)的項(xiàng)目主輸入選中置入.并將屬性CustomActionData設(shè)置為/參數(shù)名=[][][][]...以這種方式寫(xiě)入在文件框中設(shè)置好的參數(shù),我們?cè)倏匆幌律厦骖?lèi)中的代碼:
- Dim Connstr As String = Me.Context.Parameters.Item("dbname")
便會(huì)取到參數(shù)dbname的值,亦就是在安裝界面時(shí)要用戶(hù)輸入的值.類(lèi)中還覆寫(xiě)了Install方法.會(huì)自動(dòng)運(yùn)行,并執(zhí)行用戶(hù)自定義的程序代碼.代碼與平時(shí)所編的VBNET一樣.上面的代碼做了二種情況,一種是從嵌入的文本文件中取得SQL語(yǔ)句,運(yùn)行它創(chuàng)建數(shù)據(jù)庫(kù).另一種是用SQL數(shù)據(jù)備份的DAT文件做為嵌入資源,在安裝過(guò)程中,由用戶(hù)輸入的參數(shù)為條件,連接SQL服務(wù)器并還原數(shù)據(jù)庫(kù)...