惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - culturenet

jQuery Mobile 小问题解决一例 flash的传值问题 Oracle 升级以后 HTTP Server 一则小错误解决 使用installshild解决某些安装文件无法在win2003上安装的问题 vsta下vs2005产生错误,解决之 Test Windows Live Write (Bate) Gridview中当设置自动生成列时对列中字段使用 html代码显示 修改ppt另存为网页的mht文件内容,更改其显示方式 修改OleDB provider 移植 Data Application Blocks项目中使用存储过程的应用(Oracle or MsSqlServer)到Microsoft Access Enterprise Library- Data Block 使用MS Access的问题的解决 Oracle Services For Microsoft Transaction Server的问题的发现与解决 LinkButton 的提交两次问题的解决 Enterprise Library- Data Block使用oracle存储过程,字符串参数传入值为""时出现问题的解决 Enterprise Library - Data Block oracle返回 cursor 问题的解决 web.config中的pageBaseType问题 修改客户端Script,解决r.a.d.controls Q2 2005中TreeView 控件遮挡问题 [导入]汉字区位码查询 [导入]c#取得汉字的拼音的首字母。 [导入]url传递中文的解决方案总结 [导入]转:url传递中文的解决方案总结
installshield安装文件的制作小技巧--附加数据库
culturenet · 2006-12-19 · via 博客园 - culturenet

         最近又一个项目接近尾声,不过对方要求安装必须傻瓜化,尽量不用手动配置。于是就的重新捡起两三年没有用过的installshield了。找到 installshield 12  于是,着手开始制作安装包。因为是网站项目,所以,其他方面倒是问题不大,因为当年用installshield 6.2的时候,也是相当熟练的。最主要的有两个方面:一、数据库的安装,因为我的数据库里面有许多存储过程和初始数据,所以不想直接用script来初始化。于是就想直接在安装包中把数据库文件和日志文件打包,然后在安装时直接附加就行。二、修改web.config文件中的数据库连接字符串和一些相关的参数,比如一些路径相关的参数等等。

      其中第一点经过摸索和总结,有两种方法:1、直接使用自定义的函数,声称sql语句,然后调用osql.exe来执行。

函数如下:

function number CreateDataBase(svSQLsvr,svSQLusr,svSQLpwd) 
STRING szCmdLine,szWaitTxt; 
begin 
szWaitTxt
=" 正在创建所需数据库."
SdShowMsg (szWaitTxt, 
TRUE); 
Delay(
2); 

 
if(g_bWinLogin) then
    szCmdLine 
= "/E  /S "+svSQLsvr+" /Q \"EXEC  sp_attach_db  @dbname  =  N'dlbj',@filename1  = N'"+TARGETDIR ^"mydb.MDF',@filename2  = N'"+TARGETDIR ^"dlbj_web_log.LDF'\""; 
 else
   szCmdLine 
= "/U "+svSQLusr+" /P "+svSQLpwd+" /S "+svSQLsvr+" /Q \"EXEC  sp_attach_db  @dbname  =  N'dlbj',@filename1  = N'"+TARGETDIR ^"dlbj_web.MDF',@filename2  = N'"+TARGETDIR ^"mydb_log.LDF'\""; 
 endif; 
//szCmdLine = "/U "+svSQLusr+" /P "+svSQLpwd+" /S "+svSQLsvr+" /Q \"EXEC  sp_attach_db  @dbname  =  N'dlbj',@filename1  = N'"+TARGETDIR ^"dlbj_web.MDF',@filename2  = N'"+TARGETDIR ^"dlbmydb_log.LDF'\""; 

if (LaunchAppAndWait("osql.exe", szCmdLine,WAIT) < 0then 
MessageBox (
"数据库创建失败!请确您的系统中已安装 Microsoft SQL Server 2000. 如仍无法解决,请联系系统供应商!",SEVERE); 
endif; 
SdShowMsg (szWaitTxt, 
FALSE); 
szWaitTxt
=" 正在优化系统数据库."
SdShowMsg (szWaitTxt, 
TRUE); 
Delay(
2); 
szCmdLine 
= "/U "+svSQLusr+" /P "+svSQLpwd+" /S "+svSQLsvr+" /Q \"use dlbj ; exec sp_updatestats\""
if (LaunchAppAndWait("osql.exe", szCmdLine,WAIT) < 0then 
MessageBox (
"数据库优化失败!您可以在 sql查询分析器中执行 use dlbj ; exec sp_updatestats 完成!",SEVERE); 
endif; 
SdShowMsg (szWaitTxt, 
FALSE);  

return 
0

end

然后在OnEnd中执行如下代码:

if !MAINTENANCE then

CreateDataBase(g_szServer,g_szUser,g_szPassword);
endif;

 其中,g_szServer,g_szUser,g_szPassword分别为,在installshield中数据库设置界面(或者自定义窗口)中操作得到的服务器地址,用户名和密码。

2、直接在 安装设计视图中创建连接后,直接创建一个sqlscript,会在安装的时候直接执行。这样的话就的提前知道安装的位置(这是不可能的),于是就直接写成可替换的字符串,然后使用 text replacement 选项卡,设置替换项。其中,sqlscript如下:

 USE master; 
 
GO
-- Drop database if it exists. 
IF EXISTS (SELECT name FROM sys.databases WHERE NAME = 'dmydb'
   
DROP DATABASE dmydb; 
GO
CREATE DATABASE dlbj ON PRIMARY 
   (FILENAME 
= 
      
'%TEXT_TO_BE_REPLACED_IN_THE_FILE%\dmydb.mdf')
   
LOG ON (FILENAME = 
      
'%TEXT_TO_BE_REPLACED_IN_THE_FILE%\dmydb_log.LDF')
   
FOR ATTACH;
GO

其中:%TEXT_TO_BE_REPLACED_IN_THE_FILE% 是要替换为安装目录的字符串。

这里有个值得注意的地方,如果是installscript项目。那么,在text replacement 选项卡,替换后的内容不能直接设置为[INSTALLDIR]或者 [TARGETDIR],而是要同样设置为一个替换变量,如:<USER_DATA>,即就是,把:%TEXT_TO_BE_REPLACED_IN_THE_FILE% 替换为:<USER_DATA>,然后在 installscript 的 Dlg_SdAskDestPath2: 代码段中,执行如下语句即可。

TextSubSetValue ("<USER_DATA>", TARGETDIR , TRUE );

当时这里困扰我很长世界,最后还是上国外的网站上找到了解决方案。

对于第二点,则,直接使用函数:

function UpdateKey( svFilePath, svFindEntry, svNewEntry)
 NUMBER nResult, nvLineNumber;
 
STRING WebConfigFile, svReturnLine;

 begin
  
// build the path to the Web.Config     
  WebConfigFile 
= svFilePath ^ "web.config";

  
// search the file for the key we specify
  nResult 
= FileGrep( WebConfigFile, svFindEntry, svReturnLine, nvLineNumber, RESTART );
  switch(nResult)
   
case 0:
    
// Since this line normally appears twice in our web.config file, we're 
    // checking for the existence of a 2nd match and updating it instead.
    
// If there is no 2nd match, go ahead and update the one we find.
    
if ( svFindEntry = "connectionString" ) then
     nResult 
= FileGrep( WebConfigFile, svFindEntry , svReturnLine, nvLineNumber, CONTINUE );
     
if ( nResult < 0 ) then
      FileGrep( WebConfigFile, svFindEntry, svReturnLine, nvLineNumber, RESTART );
     endif;
    endif;
   
    
// once we find the key, update (replace) it with our new values
    
if ( FileInsertLine( WebConfigFile, svNewEntry, nvLineNumber, REPLACE ) < 0 ) then
     
// hmmm we couldn't update the value of the key
     MessageBox( "Unable to update Web.Config file.", SEVERE );
    endif;
   
case -2:
    
// File Not Found
    MessageBox( 
"Web.Config file not found.", SEVERE );
   
case -4:
    
// EOF reached
    MessageBox( svFindEntry 
+ " key not found.", SEVERE );
   default:
    
//unknown error
    MessageBox( 
"An unknown error has occurred. The Web.Config file has NOT been updated.", SEVERE );
  endswitch; 
 
end;

即可。

我自定义的简单 skin.