如何用installshield打包好的应用程序的同时安装MS Server数据库(是在没有安装MS Server的机子上安装MS Server,不是在已有MS Server的机子上安装数据库),但是好像没有真正解决的帖子,不知道哪位高手知道的,帮个忙,谢谢!

解决方案 »

  1.   

    1、需要的文件   
      sqlrun.cab   
      setup.ell   
      sqlrun01.msi   
      instmsi.exe   
      setup.exe   
      sqlresld.dll   
      (win200   可能需要semnt.dll)   
        
      2、新建一配置文件   
      例;a.ini   
      [Options]   
      TARGETDIR="C:\Program   Files\Microsoft   SQL   Server\MSSQL\Binn\"   
      DATADIR="C:\Program   Files\Microsoft   SQL   Server\MSSQl\Data\"   
      INSTANCENAME="实例名"   
      SAPASSWORD="密码"   
      SECURITYMODE=SQL   
      说明:   
      TARGETDIR   安装目录   
      DATADIR   数据库安装目录,在该目录下应该有master,msdb,tempdb,model数据库(8个文件),如果是新环境,可能需要将这几个文件打包到安装包,嗯,安装文件现的大一些,cool一些,嘿嘿(符合微软作风)   
      SAPASSWORD设置密码,但这个密码好像没用,安装之后再通过sqldmo改(加密?)   
      SECURITYMODE=SQL一定要,否则不能用查询分析器连接   
        
      3、命令   
      安装setup.exe   /i   sqlrun01.msi   /settings   a.ini   /l   log.log   
      卸载setup.exe   /x   sqlrun01.msi   
        
      4、备注   
        
      如果是win2000,要将semnt.dll提前装到TARGETDIR\mssql$‘实例’\binn下   
      文件都可以在sqlserver安装盘上找到,如果不清楚可以问我   
        
      一共可以安装16个实例,相应的用sqlrunXX。msi,   
      如果不想装客户端连接工具,请再加上两了dll:DBNMPNTW.DLL;ntwdblib.DLL   
        
        
        
      或使用MSDE:   
        
      msde可以很容易的和自己的程序发布。   
      msde在sql   server的msde目录中   
      主要有两种方法,   
      简单方法是使用setup.exe,复杂方法是实用\msde\msm下的合并模块,可以将其无缝的集成到自己的msi安装程序里,不过很麻烦。   
        
      第一种方法主要是设置setup.ini和setup.exe的命令行参数。   
      例如:   
        
      1   [Options]   
      2   TARGETDIR="D:\Setup\msde\binn"   
      3   DATADIR="D:\Setup\msde\data"   
      4   INSTANCENAME="我的实例名称"                 
      5   SECURITYMODE="SQL"   
      6   USEDEFAULTSAPWD   
        
      注意:   
      4   安装命名实例可以避免和用户计算机上可能存在的sql   server发生冲突   
      5   验证模式为混合模式   
      6   sa密码为空   
        
      使用:F:\MSDE\SETUP   /i   F:\MSDE\setup\sqlrunXX.msi     
      就可以删除其他15个   sqlrunXX.msi了   
        
      
      

  2.   

    function OnFirstUIAfter()
        STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2;
        NUMBER bvOpt1, bvOpt2;
        NUMBER bShowUpdateServiceDlg;
        STRING szWaitText;
        STRING szServiceName;
        NUMBER svServiceState;
        STRING szMsde2000, szCmdLine,szStartServiceArgs;
    begin
        // 如果安装程序以“维护”模式启动
        if (MAINTENANCE) then
            goto EndProcess;
        endif;    // 检查系统是否安装了 MSDE 2000 SP4
        szWaitText = "正在检查系统是否安装了 MSDE2000 SP4 …….";
        SdShowMsg( szWaitText, TRUE);    
        
        szServiceName = "MSSQLSERVER";
        if(ServiceGetServiceState(szServiceName, svServiceState) < ISERR_SUCCESS) then
            // 没有安装 MSDE,转安装处理
            goto InstallMSDE;    
        endif;
        goto StartMSDE; 
        
    InstallMSDE:  // 安装数据库服务  
        szWaitText = "正在安装 MSDE2000 SP4。这个过程需要几分钟,请稍等";
        SdShowMsg(szWaitText, TRUE); 
        
        szMsde2000 = SRCDIR ^ "MSDE" ^ "setup.exe";
        // 将 MSDE 2000 SP4 安装到系统 Program File 目录下
        szCmdLine = "TARGETDIR=\"" + PROGRAMFILES + "\" /q";
        if(LaunchAppAndWait(szMsde2000, szCmdLine, LAAW_OPTION_WAIT|LAAW_OPTION_MAXIMIZED) < 0 ) then
            MessageBox ("安装 MSDE2000 SP4 失败,请联系系统管理员!", SEVERE);
            goto EndProcess;
        endif;StartMSDE: // 启动 MSDE2000 服务
        szWaitText = "正在启动 MSDE2000 SP4 …….";
        SdShowMsg( szWaitText, TRUE);    
       
        // 安装了 MSDE 2000, 试着启动服务
        szStartServiceArgs = "";    
        if(svServiceState != SERVICE_RUNNING) then
            if (ServiceStartService (szServiceName, szStartServiceArgs) < ISERR_SUCCESS ) then
                MessageBox ("启动服务" + szServiceName + "出错。", SEVERE);
                goto EndProcess;
            endif;        
        endif;    // 加载用户数据库
        szWaitText = "正在创建所需数据库.";
        SdShowMsg(szWaitText, TRUE);
        Delay(2); 
        
        // 先试着分离先前已经加载的数据库
        szCmdLine = "-E -Q \"exec exec sp_detach_db mytest \"";   //*****
        if(LaunchAppAndWait("osql.exe ", szCmdLine, LAAW_OPTION_WAIT|LAAW_OPTION_HIDDEN) < 0) then 
            MessageBox ("分离原来的数据库失败!请确认系统中已安装 MSDE 2000 SP4 并且服务已启动。\n如问题仍无法解决,请与联系统管理员联系!", SEVERE); 
        endif; 
        
        // 将数据文件复制到程序安装目录
        CreateDir( TARGETDIR ^ "Data");
        CopyFile( SRCDIR ^ "Data" ^ "mytest_Data.mdf", TARGETDIR ^ "Data" ^ "mytest_Data.mdf");  //*****
        CopyFile( SRCDIR ^ "Data" ^ "mytest_Log.ldf", TARGETDIR ^ "Data" ^ "mytest_Log.ldf");    //*****
        
        // 附加数据库    
        szCmdLine = "-E -Q \"exec sp_attach_db 'mytest', '"+  TARGETDIR ^ "Data" ^ "mytest_Data.mdf', '" +  TARGETDIR ^ "Data" ^ "mytest_Log.ldf' \""; //*****
        if (LaunchAppAndWait("osql.exe ", szCmdLine, LAAW_OPTION_WAIT|LAAW_OPTION_HIDDEN) < 0) then 
              MessageBox ("数据库创建失败!请确认系统中已安装 MSDE 2000 SP4 并且服务已启动。\n如问题仍无法解决,请与联系统管理员联系!", SEVERE); 
        endif;
        
        SdShowMsg(szWaitText, FALSE);     
        
    EndProcess:    
        
        // 以下代码是系统自动插入的
        ShowObjWizardPages(NEXT);
        
        szTitle = "";
        szMsg1 = ""; 
        szMsg2 = "";
        szOpt1 = "";
        szOpt2 = "";
        bvOpt1   = FALSE;
        bvOpt2   = FALSE;        // Set this to true if you have the update service enabled, and if you want to check for updates.
        // Note: the ISUS Starter Edition does not support checking for updates programatically.  So, 
        // only set this to true if you have at least the ISUS Professional Edition.
        bShowUpdateServiceDlg = FALSE;
        
        //{{IS_SCRIPT_TAG(Dlg_SdDinishEx)    
        
        if ( BATCH_INSTALL ) then
            SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );
        else
            
            // If the update service is enabled, show finish dialog that includes
            // update check option.
            if( bShowUpdateServiceDlg && ( ENABLED_ISERVICES & SERVICE_ISUPDATE ) ) then            if( SdFinishUpdateEx( szTitle, szMsg1, szMsg2, szOpt1, szOpt2, TRUE ) ) then                // Don't check for updates in silent mode.
                    if( MODE != SILENTMODE ) then
                        UpdateServiceCheckForUpdates( "", FALSE );
                    endif;            endif;        else
                SdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bvOpt1 , bvOpt2 );
            endif;    endif;
        //}}IS_SCRIPT_TAG(Dlg_SdDinishEx)    
    end;