installshield創建數據庫

軟件打安裝包,最不好弄是註冊表和數據庫,以前一直用installshield 6.3,註冊表和數據庫要手動寫script,很煩,經常出錯,因爲is不跟蹤調用的外部程序,所以出錯的時候沒有容錯處理,沒有報錯,客戶生成數據庫的時候不行,就是不行,不知道爲什麼不行

這個是installshield 6.3的時候生成數據庫的方法

#i nclude "ifx.h"
//NNLL添加全局變量
BOOL bvType;  //記錄安裝類型,是否服務器
string szMyse,szMyna,szMypa;   //SQL的服務器名、用戶名、登錄密碼
//NNLL添加完畢

在function OnFirstUIBefore()裏,添加兩個對方框,第一個是SelectType,用來給客戶選擇是不是安裝服務器程序,如果是安裝服務器程序,進入第二個對方框Dlg_SdShowDlgEdit3,在這裏要求用戶輸入安裝數據庫的機器名、用戶名和密碼

//NNLL加入判斷,安裝的是服務器還是工作站
SelectType:
szMsg="請選擇安裝的計算機用於:"   ;
bvCheck1 = TRUE;                     
bvCheck2 = FALSE;
bvType = TRUE;
nResult = AskOptions ( EXCLUSIVE , szMsg , "服務器" , bvCheck1 , "工作站" , bvCheck2 );
    if (nResult = BACK) goto Dlg_SdLicense2;
    if bvCheck2 = TRUE then
       //工作站,註冊表項server=0
       bvType = FALSE;
    else
       //服務器,註冊表項server=1
       bvType = TRUE;
   endif;

if bvType = TRUE then
Dlg_SdShowDlgEdit3:   
    szMsg   = "請輸入服務器名或服務器的IP地址、登錄數據庫的用戶名和密碼";
    szTitle = "請輸入服務器信息";
    szField1 = "服務器名";
    szField2 = "用戶名";
    szField3 = "密碼";
    nResult = SdShowDlgEdit3 (szTitle, szMsg, szField1, szField2, szField3, szMyse, szMyna, szMypa);
    if (nResult = BACK) then
       goto SelectType;
    else
       if (szMyse = "") then
          MessageBox("請輸入服務器名或IP地址",INFORMATION);
          goto  Dlg_SdShowDlgEdit3;
       elseif (szMyna = "") then  
          MessageBox("請輸入數據庫登錄用戶名",INFORMATION);
          goto  Dlg_SdShowDlgEdit3;
       elseif (szMypa = "") then
          MessageBox("請輸入數據庫登錄密碼",INFORMATION);
          goto  Dlg_SdShowDlgEdit3;
       endif;
    endif;
endif;
//NNLL修改完畢

添加OnEnd函數生成數據庫

//NNLL開始添加函數
function OnEnd()
    string sztemp;
    string szFileNa;
    STRING szCmdLine,szWaitTxt;
begin
if !MAINTENANCE then      //非維護性代碼,即只在安裝時執行
   //修改ini文件
   szFileNa = TARGETDIR + "//config.ini";
   sztemp = "LogPass = " + szMypa;
   FileInsertLine (szFileNa, sztemp, 3, REPLACE);
   sztemp = "ServerName = " + szMyse;
   FileInsertLine (szFileNa, sztemp, 4, REPLACE);
   sztemp = "LogId = " + szMyna;
   FileInsertLine (szFileNa, sztemp, 5, REPLACE);
  
   //修改nnll.sql
   szFileNa = TARGETDIR + "//mydata//nnll.sql";
   sztemp = "CREATE DATABASE [WLpalestra]  ON (NAME = N'homelandj_Data', FILENAME = N'" + TARGETDIR + "//mydata//homelandj.MDF' , SIZE = 5, FILEGROWTH = 10%) LOG ON (NAME = N'homelandj_Log', FILENAME = N'" + TARGETDIR + "//mydata//homelandj_log.LDF' , FILEGROWTH = 10%)";
   FileInsertLine (szFileNa, sztemp, 1, REPLACE);
   sztemp = "FROM DISK = '" + TARGETDIR + "//mydata//nnll.bak'";
   FileInsertLine (szFileNa, sztemp, 44, REPLACE);
     
   //處理數據庫
   if bvType then
      //MessageBox("服務器",INFORMATION);
      szWaitTxt=" 正在創建"+@PRODUCT_NAME+"所需數據庫....";
      SdShowMsg (szWaitTxt, TRUE);
      Delay(2);
      //szCmdLine = "-U "+szMyna+" -P "+szMypa+" -S "+szMyse+" -Q /"exec sp_attach_db N'GBWZ' , N'"+TARGETDIR ^"//wzgldata//GBWZ_Data.mdf'/"";
      szCmdLine = "-U "+szMyna+" -P "+szMypa+" -S "+szMyse+" -E -i /"" +  TARGETDIR + "//nnll.sql/"";
      //MessageBox(szCmdLine,INFORMATION);
      if (LaunchAppAndWait("osql.exe", szCmdLine,WAIT) < 0) then
          MessageBox ("數據庫創建失敗!請確認您的系統中已安裝 Microsoft SQL Server 2000./n如仍無法解決,請聯繫系統供應商!",SEVERE);
      endif;
    endif;
endif;
end;

從紅色的“//修改nnll.sql”開始就是生成數據庫了,因爲要生成數據庫,所以要調用一個sql文件,這個sql文件我要copy到用戶的機器上,我要把sql文件裏面對應的生成數據庫兩個文件的路徑替換,調用osql.exe執行sql文件生成數據庫

數據庫的生成,三步:

1、寫sql腳本,這個是肯定的啊,要寫SQL腳本生成數據庫的

2、設置進入Server Configuration->SQL Scripts,設置數據庫連接和腳本信息

①右擊SQL Scripts,New SQL Connection,添加數據庫連接,如下圖:

500){this.resized=true;this.style.width=500;}">

這裏設置的Catalog Name、LoginID、password是默認的,在安裝程序進行的時候,會生成這樣的界面,用戶可以自己修改:

500){this.resized=true;this.style.width=500;}" resized="true">

這個界面相當於在installshield 6.3裏的那個收集數據庫信息的Dlg_SdShowDlgEdit3對話框,現在是由is自動生成的,由is自動生成的這個對話框的下一步,是用於檢測數據庫的連接狀態的

②右擊SQLConnection,Import script files,添加sql腳本,選擇Text Replacement標籤,在這裏設置數據庫的路徑,如圖:

500){this.resized=true;this.style.width=500;}">

這裏的設置相當於在installshield 6.3裏在OnEnd函數裏的手工替換,這裏我把“d:/”替換成“<TARGETDIR>/database/”,因爲在sql腳本里,我寫了把數據庫的兩個文件放在d:/,我現在想把數據庫生成在用戶安裝目錄下的database文件夾

3、修改腳本,添加安裝方式,如果用戶安裝服務器端程序,生成數據庫,如果用戶安裝的是客戶端程序,跳過數據庫的安裝

//NNLL加入判斷,安裝的是服務器還是工作站
SelectType:
szMsg="請選擇安裝的計算機用於:"   ;
bvCheck1 = TRUE;                     
bvCheck2 = FALSE;
bvType = TRUE;
nResult = AskOptions ( EXCLUSIVE , szMsg , "服務器" , bvCheck1 , "工作站" , bvCheck2 );
    if (nResult = BACK) goto Dlg_SdLicense2;
    if bvCheck2 = TRUE then
       //工作站,註冊表項server=0
       bvType = FALSE;
    else
       //服務器,註冊表項server=1
       bvType = TRUE;
   endif;
//NNLL修改完畢

if bvType = TRUE then
Dlg_SQLServer:         //數據庫連接
    nResult = OnSQLServerInitialize( nResult );
    if( nResult = BACK ) goto Dlg_SdFeatureTree;

Dlg_ObjDialogs:         //測試數據庫連接
    nResult = ShowObjWizardPages( nResult );
    if (nResult = BACK) goto Dlg_SQLServer;
endif;

看,installshield11.5就這樣生成數據庫了,比6.3容易很多很多很多,對不對?好開心啊,用11.5

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章