如何在Inno Setup中使用数据库为.NET应用程序安装文件?

时间:2011-07-28 12:43:12

标签: c# .net database sql-server-2008 inno-setup

我找不到任何例子,所以我不确定这是否可行。我想做的是:

我想用数据库安装.NET C#windows服务。所以我的要求是客户机上的.NET Framework和SQL Server 2008。

所以,它必须看起来像这样:

  1. 检查是否存在.NET Framework 4.0和SQL Server 2008
  2. 如果找不到SQL Server,请求客户选择路径或离开。
  3. 最终安装.NET Framework 4.0
  4. 登录SQL Server,并(从脚本)创建表,procs等..
  5. 从cmd行安装wnd服务。在这一点上,我还必须在我的app.config中设置connectionstring - 这可能吗?)
  6. 我想在Inno设置中这样做。那可能吗?

4 个答案:

答案 0 :(得分:3)

好吧,我可以帮助1和3。

要检查.NET框架,可以使用以下方法(如果需要,还将安装.NET框架)。我目前用它来检查.NET 2.0,但你可以改变它查找的版本来检查4.0。

[Files]
Source: Files\dotnetfx.exe; DestDir: {tmp}; Flags: ignoreversion; Check: NeedsFramework

[Run]
Filename: {tmp}\dotnetfx.exe; Parameters: "/q:a /c:""install /l /q"""; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg: Installing .NET Framework if needed. This may take several minutes.

[Code]

// .NET install helpers

// Indicates whether .NET Framework 2.0 is installed.
function IsDotNET20Detected(): boolean;
var
    success: boolean;
    install: cardinal;
begin
    success := RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727', 'Install', install);
    Result := success and (install = 1);
end;

//RETURNS OPPOSITE OF IsDotNet20Detected FUNCTION
//Remember this method from the Files section above
function NeedsFramework(): Boolean;
begin
  Result := (IsDotNET20Detected = false);
end;

//IF SETUP FINISHES WITH EXIT CODE OF 0, MEANING ALL WENT WELL
//THEN CHECK FOR THE PRESENCE OF THE REGISTRY FLAG TO INDICATE THE
//.NET FRAMEWORK WAS INSTALLED CORRECTLY
//IT CAN FAIL WHEN CUST DOESN'T HAVE CORRECT WINDOWS INSTALLER VERSION
function GetCustomSetupExitCode(): Integer;
begin
  if (IsDotNET20Detected = false) then
    begin
      MsgBox('.NET Framework was NOT installed successfully!',mbError, MB_OK);
      result := -1
    end
end;

请注意,此解决方案源自this article。您可以从microsoft网站下载dotnetfx for .NET 4.0。

对于第4步,我建议您创建一个安装在用户计算机上的工具/脚本,然后根据需要从“运行”部分调用该工具/脚本。

第2步将会变得棘手,但显然并非不可能。经过一些阅读后,似乎您可以向InnoSetup添加自定义UI页面。有关方法,请参阅帮助here。你在实际的UI页面中可以做多少工作我不确定。

值得注意的是,使用InnoSetup中的Pascal脚本,您或多或少可以完全访问Win32函数,还可以实例化COM对象,可以想象.NET库可以暴露COM接口....?

答案 1 :(得分:0)

Inno设置俱乐部所有设置文件并压缩成一个可执行文件。当您运行此可执行文件时,它会提取您在inno设置中包含的所有文件。我认为它不会自动运行您在setup.exe中包含的可执行文件。

或者,您也可以使用wix创建设置。 Wix设置也可以为.net framework 4.0构建。

答案 2 :(得分:0)

这是我用命令行oracle sqlplus执行sql脚本的示例代码 1.示例代码

[Dirs]
; Create folders at user side 
Name: {app}\ScriptLog;

[Code]
///////////////////////////////////////////////////////////
//// Modify Sql function 
//// TagName: the script line you want to modify tag name, 
//// OldString: the old string, 
//// NewString: the new string, 
//// StringArr: the script strings array 
///////////////////////////////////////////////////////////
function ModifySql(var TagStr, OldStr, NewStr: String; const StringArr: array of String): Boolean;
var 
  batPath: String;
  tmpStr: String;
  ResultCode: Integer;
  i: Integer; 

begin
  result := false;

  for i:= 0 to GetArrayLength(StringArr)-1 do
    // if TagStr and OldStr are in the same line
    if ( (StringArr[i] <> '') and (Pos(TagStr, StringArr[i]) > 0) and (Pos(OldStr, StringArr[i]) > 0) ) then
      //replace OldStr with NewStr
      StringChange(StringArr[i], OldStr, NewStr);
end;

///////////////////////////////////////////////////////////
//// Search ORA- Error function 
//// the script exec result, for example : Error or ORA-xxxxx
///////////////////////////////////////////////////////////
function Check_Exec_Script_Result(var ErrStr, LogFile: String): Boolean;
var
  LogFileLines: TArrayOfString;
  ResultCode: Integer;
  i: Integer; 

begin
  //assign sql file 
  //load strings and store to SqlFileLines 
  LoadStringsFromFile(LogFile, LogFileLines); 
  result := false;

  for i:= 0 to GetArrayLength(LogFileLines)-1 do 
    // if TagStr and OldStr are in the same line
    if ( (LogFileLines[i] <> '') and (Pos(ErrStr, LogFileLines[i]) > 0) ) then
      MsgBox('Err' + LogFileLines[i] , mbError, MB_OK);

end;


///////////////////////////////////////////////////////////
//// execute Script with Sqlplus
///////////////////////////////////////////////////////////
procedure Exec_Script_Sqlplus(var dbTns, dbUser, dbPwd, scriptPath, batFileName: String);
var 
  batPath: String;
  tmpStr: String;
  ResultCode: Integer;
  LogFileName: String;
  ErrStr: String;

begin

  // generate bat file
  batPath := ExpandConstant('{tmp}\' + batFileName + '.bat');
  tmpStr := 'cd \' + ''#13''#10;
  SaveStringToFile(batPath, tmpStr, False);
  //tmpStr :=  'quit | sqlplus ' + dbUser + '/' + dbPwd + '@' + dbTns + ' @' + scriptPath + ''#13''#10;;
  tmpStr :=  'echo quit | sqlplus ' + dbUser + '/' + dbPwd + '@' + dbTns + ' @' +'"'+ scriptPath +'"'+ ''#13''#10;
  SaveStringToFile(batPath, tmpStr, True);

  // set log file path
  LogFileName := ExpandConstant('E:\123\' + batFileName + '.txt');

  //MsgBox(batPath, mbError, MB_OK);
  if Exec(batPath, ' > "' + LogFileName + '"', '', 1, ewWaitUntilTerminated, ResultCode) then
  begin
    // handle success if necessary; ResultCode contains the exit code
    if (ResultCode = 0) then begin
      ErrStr := 'ORA';
      Check_Exec_Script_Result(ErrStr, LogFileName);
      // open ScriptLog file
      ShellExec('', ExpandConstant(LogFileName),'', '', SW_SHOW, ewNoWait, ErrorCode)

      //MsgBox('OK', mbError, MB_OK);
      //result := true;
    end;
  end
  else begin
      MsgBox('Exec:' + scriptPath + 'fail,please check parameters setting', mbError, MB_OK);
      //handle failure if necessary; ResultCode contains the error code
  end;

end;

///////////////////////////////////////////////////////////
//// 1. Set Sql Script Parameters ,ex: DB TNS,Account,PWD
//// 2. Call function ModifySql, to modify Sql Script 
//// 3. Call function Exec_Script_Sqlplus, to exec Sql Script with sqlplus
///////////////////////////////////////////////////////////
procedure SetSql_ExecSqlScript();
var
  SqlFile: String; 
  OldString: String; 
  NewString: String;
  TagName: String;
  batFileName: String;
  SqlFileLines: TArrayOfString;

  LocalInfoPath: String;
  LocalInfoLines: TArrayOfString;
  LocalInfoStr: String;
  i: Integer;

begin

  //assign sql file 
  //========================start of 1_Sample_system.sql========================
  SqlFile := WizardDirValue() + '\SQL\1_Sample_system.sql';
  //create bat file
  batFileName :=  '1_Sample_system';
  //load strings and store to SqlFileLines 
  LoadStringsFromFile(SqlFile, SqlFileLines); 

  //set modify parameters
  TagName := 'CREATE USER';
  OldString := 'Sample';
  NewString := DBAppUser;
  ModifySql(TagName, OldString, NewString, SqlFileLines);

  TagName := 'GRANT CREATE';
  OldString := 'Sample';
  NewString := DBAppUser;
  ModifySql(TagName, OldString, NewString, SqlFileLines);

  TagName := 'GRANT CONNECT';
  OldString := 'Sample';
  NewString := DBAppUser;
  ModifySql(TagName, OldString, NewString, SqlFileLines);

  TagName := 'ALTER USER';
  OldString := 'Sample';
  NewString := DBAppUser;
  ModifySql(TagName, OldString, NewString, SqlFileLines);

  TagName := 'IDENTIFIED';
  OldString := '1234abcd';
  NewString := DBAppPwd;
  ModifySql(TagName, OldString, NewString, SqlFileLines);

  //save modified strings to file
  SaveStringsToFile(SqlFile, SqlFileLines, False);

  //Exec Script with Sqlplus
  Exec_Script_Sqlplus(DBSystemTNS, DBSystemUser, DBSystemPwd, SqlFile , batFileName);
  //========================end of 1_Sample_system.sql========================

  //========================start of 2_Sample_create_schema.sql========================
  SqlFile := WizardDirValue() + '\SQL\2_Sample_create_schema.sql';
  //create bat file
  batFileName :=  '2_Sample_create_schema';

  //Exec Script with Sqlplus
  Exec_Script_Sqlplus(DBAppTNS, DBAppUser, DBAppPwd, SqlFile , batFileName);
  //========================end of 2_Sample_create_schema.sql========================

  //========================start of 3_Sample_insert_data.sql========================
  SqlFile := WizardDirValue() + '\SQL\3_Sample_insert_data.sql'; 
  //create bat file
  batFileName :=  '3_Sample_insert_data';

  //Exec Script with Sqlplus
  Exec_Script_Sqlplus(DBAppTNS, DBAppUser, DBAppPwd, SqlFile , batFileName);
  //========================end of 3_Sample_insert_data.sql========================

 //========================start of 4_Sample_drop_schema.sql========================
  SqlFile := WizardDirValue() + '\SQL\4_Sample_drop_schema.sql'; 
  //create bat file
  batFileName :=  '4_Sample_drop_schema';

  //load strings form file        
  LoadStringsFromFile(SqlFile, SqlFileLines); 

  //set modify parameters
  TagName := 'DROP USER';
  OldString := 'Sample';
  NewString := DBAppUser;
  ModifySql(TagName, OldString, NewString, SqlFileLines);

  //save modified strings to file
  SaveStringsToFile(SqlFile, SqlFileLines, False);

  //Exec Script with Sqlplus
  //Exec_Script_Sqlplus(DBSystemTNS, DBSystemUser, DBSystemPwd, SqlFile , batFileName);
  //========================end of 4_Sample_drop_schema.sql========================
end;

答案 3 :(得分:0)

这是我用命令行oracle sqlplus

执行sql脚本的示例代码

2.有四个基础sql脚本