开发者

How to make install file for .NET app with database in Inno Setup?

I can't find any example, so I'm not sure if that is possible. What I want to do is:

I want to install .NET C# windows service with database. So my requirements will be .NET Framework and SQL Server 2008 on the clients machine.

So, it has to look like that:

  1. check if there is .NET Framework 4.0 and SQL Server 2008
  2. If cant find SQL Server - than ask client to choose the path or leave.
  3. Eventually install .NET Framework 4.0
  4. Log into SQL Server, and (from script) create tables, procs etc..
  5. Inst开发者_Python百科all wnd service from cmd line. In this point I also have to setup the connectionstring in my app.config - is that possible?)

I want to do that in Inno setup. Is that possible?


Well, I can help with 1 and 3.

To check for the .NET framework, you can use the following method (which will also install the .NET framework, if needed). I currently use it to check for .NET 2.0, but you can just change the version it looks for to check for 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;

Note that this solution was derived from this article. You can download dotnetfx for .NET 4.0 from the microsoft website.

As for step 4, I would suggest that you create a tool/script which gets installed on the user's machine, which you then call from the Run section as needed.

Step 2 is going to be tricky, but apparently not impossible. After some reading it appears as though you can add custom UI pages to InnoSetup. See the help here for the method. How much work you can do in the actual UI page I'm not sure.

It's worth noting that using the Pascal scripting in InnoSetup you more or less have complete access to Win32 functions, plus the ability to instantiate COM objects, which could conceivably be .NET librarys exposing a COM interface....?


Inno setup clubs all setup files and compressed into a single executable. when you run this executable it extract all the file which you have included in inno setup. I don't think it automatically run the executables which you have included in your setup.exe.

Alternatively you can also create the setup using wix. Wix setup can be build for .net framework 4.0 as well.


this is my sample code to exec sql script with commandline oracle sqlplus 1. sample code

[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;


this is my sample code to exec sql script with commandline oracle sqlplus

2.there four basis sql script

  • (A)1_Sample_system.sql - your need db system role to create user
  • (B)2_Sample_create_schema.sql - use new user to create table
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜