Как сделать установочный файл для приложения .NET с базой данных в Inno Setup? - PullRequest
1 голос
/ 28 июля 2011

Я не могу найти ни одного примера, поэтому я не уверен, возможно ли это. Что я хочу сделать, это:

Я хочу установить .NET C # windows service с базой данных. Поэтому мои требования будут .NET Framework и SQL Server 2008 на клиентском компьютере.

Итак, это должно выглядеть так:

  1. проверить, есть ли .NET Framework 4.0 и SQL Server 2008
  2. Если не удается найти SQL Server - попросите клиента выбрать путь или уйти.
  3. В конечном итоге установить .NET Framework 4.0
  4. Войдите в SQL Server и (из скрипта) создайте таблицы, процедуры и т. Д.
  5. Установить службу wnd из строки cmd. На этом этапе мне также нужно настроить строку подключения в моем app.config - это возможно?)

Я хочу сделать это в настройках Inno. Это возможно?

Ответы [ 4 ]

3 голосов
/ 28 июля 2011

Ну, я могу помочь с 1 и 3.

Чтобы проверить .NET Framework, вы можете использовать следующий метод (который также при необходимости установит .NET Framework).В настоящее время я использую его для проверки на .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;

Обратите внимание, что это решение было получено из этой статьи ,Вы можете скачать dotnetfx для .NET 4.0 с веб-сайта Microsoft.

Что касается шага 4, я бы предложил создать инструмент / скрипт, который устанавливается на компьютер пользователя, который затем вызывается из раздела «Выполнить».при необходимости.

Шаг 2 будет сложным, но, по-видимому, не невозможным.После некоторого чтения кажется, что вы можете добавить пользовательские страницы интерфейса в InnoSetup.См. Справку здесь для метода.Сколько работы вы можете сделать на реальной странице пользовательского интерфейса, я не уверен.

Стоит отметить, что при использовании сценариев Pascal в InnoSetup вы более или менее имеете полный доступ к функциям Win32, а также возможность создавать экземпляры COM-объектов, которые, возможно, могут быть библиотеками .NET, представляющими интерфейс COM ....

0 голосов
/ 29 июля 2011

это мой пример кода для выполнения сценария sql с командной строкой oracle sqlplus

2. Есть четыре базовых сценария SQL

  • (A) 1_Sample_system.sql - ваша системная роль db для создания пользователя
  • (B) 2_Sample_create_schema.sql - использовать нового пользователя для создания таблицы
0 голосов
/ 29 июля 2011

это мой пример кода для выполнения сценария sql с командной строкой oracle sqlplus 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;
0 голосов
/ 28 июля 2011

Inno setup объединяет все установочные файлы и сжимает в один исполняемый файл.когда вы запускаете этот исполняемый файл, он извлекает все файлы, которые вы включили в настройку inno.Я не думаю, что он автоматически запускает исполняемые файлы, которые вы включили в ваш setup.exe.

В качестве альтернативы вы также можете создать установку, используя wix .Настройка Wix также может быть собрана для .net framework 4.0.

...