InstallShield在MySQL和Oracle中執行SQL指令碼的方法InstallShield在MySQL和Oracle中執行SQL指令碼的方法

來源:互聯網
上載者:User
簡述

InstallShield已經內建了對MySQL和Oracle的支援。但是這個功能是通過ODBC實現的,它對SQL指令碼的格式要求非常嚴格,因此已經通過官方用戶端測試的指令碼在IS中執行時往往就會報錯。

一般來說,資料庫指令碼只保證通過官方用戶端測試即可,同時維護一份供IS執行的指令碼費時費力。因此,考慮安裝程式對兩資料庫的支援通過官方用戶端實現。

MySQL

 

function InstallMySQLComponent(szComponent)    NUMBER nResult;    STRING szServer,szDB,szUser,szPassword,sCMD,sOPT,sResult1,sResult2,svLine,sMsg,sPath;    NUMBER nvFileHandle,nvCount;    LIST listStatus;begin    sMsg = '安裝'+szComponent+' ...';    SdShowMsg(sMsg, TRUE);    // source命令不認識windows路徑中的反斜線,故將SRCDIR中的反斜線替換成斜杠    sPath = SRCDIR;    StrReplace(sPath, '//', '/', 0);    // Fetch database connection information    SQLRTGetConnectionInfo( 'mysql', szServer, szDB, szUser, szPassword );    sCMD = WINSYSDIR^'cmd.exe';    sOPT = ' /c '+SRCDIR^'mysql.exe -h'+szServer+' -u'+szUser+' -p'+szPassword+' -D'+szDB;    sOPT = sOPT+' -e "source '+sPath^szComponent+'.sql" > '+SRCDIR^'dbstatus.txt 2>&1';    // Execute the script associated with the given component in database    nResult=LaunchAppAndWait(sCMD, sOPT, WAIT|LAAW_OPTION_HIDDEN);    if (nResult < 0) then        MessageBox('Failed installing '+szComponent+' !', SEVERE);        abort;    endif;    // 關閉安裝提示    SdShowMsg('', FALSE);    // Read dbstatus.txt    OpenFileMode(FILE_MODE_NORMAL);    if (OpenFile(nvFileHandle, SRCDIR, 'dbstatus.txt')<0) then        MessageBox('Failed checking the status of installing '+szComponent+' !', SEVERE);        abort;    endif;    listStatus = ListCreate(STRINGLIST);    while GetLine(nvFileHandle, svLine) = 0        ListAddString(listStatus, svLine, AFTER);    endwhile;    CloseFile(nvFileHandle);    // Count how many lines fetched from dbstatus.txt    nvCount = ListCount(listStatus);    if nvCount > 0 then        sMsg = "更新資料庫出錯,點“是”開啟記錄檔並退出安裝,點“否”直接退出安裝。/n";        sMsg = sMsg+"若錯誤可忽略,可選擇資料庫類型“none”以跳過資料庫更新並直接更新程式,/n";        sMsg = sMsg+"然後在資料庫中手工執行SQL指令碼(安裝後儲存在script目錄下)";        nResult = AskYesNo(sMsg, YES);        if (nResult = YES) then            LaunchApp(WINSYSDIR^'notepad.exe', SRCDIR^'dbstatus.txt');endif;                           abort;    endif;end;
Oracle

 

function InstallOracleComponent(szComponent)      NUMBER nResult,nvFileHandle,nIndex,nvCount;    STRING sMsg,szServer,szDB,szUser,szPassword,sCMD,sOPT,sInstance,sTmp,svLine;    LIST listStatus;begin    sMsg = '安裝'+szComponent+' ...';    SdShowMsg(sMsg, TRUE);    // Fetch database connection information    SQLRTGetConnectionInfo( 'oracle', szServer, szDB, szUser, szPassword );    nIndex = StrFind(szServer, ':');    nIndex = StrFindEx(szServer, '/', nIndex);    StrSub(sInstance, szServer, nIndex+1, 100);    sCMD = WINSYSDIR^'cmd.exe';    sOPT = ' /c '+'sqlplus.exe -L -S '+szUser+'/'+szPassword+'@'+sInstance;    sOPT = sOPT+' @'+SRCDIR^szComponent+'.sql > '+SRCDIR^'dbstatus.txt 2>&1';    // Execute the script associated with the given component in database    nResult=LaunchAppAndWait(sCMD, sOPT, WAIT|LAAW_OPTION_HIDDEN);    if (nResult < 0) then        MessageBox('Failed installing '+szComponent+' !', SEVERE);        abort;    endif;                   // 關閉安裝提示    SdShowMsg('', FALSE);    // 在dbstatus.txt中查詢字串holytail,如果存在,說明指令碼已執行完    if (FileGrep(SRCDIR^'dbstatus.txt', 'holytail', svLine, nIndex, RESTART) = 0) then        // 在dbstatus.txt中查詢字串ORA-,如果存在,說明指令碼執行出現錯誤        if (FileGrep(SRCDIR^'dbstatus.txt', 'ORA-', svLine, nIndex, RESTART) = 0) then            sMsg = "更新資料庫出錯,點“是”開啟記錄檔並退出安裝,點“否”直接退出安裝。/n";            sMsg = sMsg+"若錯誤可忽略,可選擇資料庫類型“none”以跳過資料庫更新並直接更新程式,/n";            sMsg = sMsg+"然後在資料庫中手工執行SQL指令碼(安裝後儲存在script目錄下)";            nResult = AskYesNo(sMsg, YES);            if (nResult = YES) then                LaunchApp(WINSYSDIR^'notepad.exe', SRCDIR^'dbstatus.txt');            endif;                               abort;        endif;    else        sMsg = "更新資料庫出錯,點“是”開啟記錄檔並退出安裝,點“否”直接退出安裝。/n";        sMsg = sMsg+"若錯誤可忽略,可選擇資料庫類型“none”以跳過資料庫更新並直接更新程式,/n";        sMsg = sMsg+"然後在資料庫中手工執行SQL指令碼(安裝後儲存在script目錄下)";        nResult = AskYesNo(sMsg, YES);        if (nResult = YES) then            LaunchApp(WINSYSDIR^'notepad.exe', SRCDIR^'dbstatus.txt');        endif;                           abort;    endif;end;
總結
  1. 為便於擷取指令碼在資料庫中的執行結果,故通過官方用戶端執行指令碼時通過符號“>”將用戶端的輸出資訊重新導向到dbstatus.txt中;同時,使用“2>&1”將標準錯誤輸出重新導向到標準輸出裝置上,當然,會進一步重新導向到dbstatus.txt檔案中,否則,無法擷取出錯資訊。
  2. sqlplus執行SQL指令碼後不會自動結束,故應在Oracle的指令碼後加上語句“exit;”。
  3. 重載OnSQLComponentInstalled()函數,並在其中禁止MySQL和Oracle的SQL指令碼對應的Component被執行安裝,然後通過以上兩個函數更新資料庫。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.