Как использовать Установку Inno для обновления базы данных с помощью .sql сценарий

Я хотел бы скомпилировать установку, которая соединится с удаленной базой данных с помощью учетных данных, обеспеченных пользователем, затем установит немного компонентов дб с помощью .sql сценарий.

Является то возможное использование Установкой Inno?

Подробнее:

Я хотел бы иметь пользовательскую форму, прося, чтобы пользователь ввел адрес базы данных и учетные данные, затем выполнил бы команду, которая выполнит sql сценарий, который обновит удаленный сервер базы данных.

Если обновление успешно - завершают установку с успехом.

Это - довольно общий вопрос - у меня есть много специализированных установок, которые должны подключить к различным серверам/выполнению различные сценарии - идея состоит в том, чтобы создать универсальную форму, которая обеспечит эту функциональность.

11
задан stukelly 8 April 2011 в 07:53
поделиться

1 ответ

Я не думаю, что вы можете иметь полностью общую форму, так как для разных серверов вам может понадобиться либо одна строка соединения, либо имя сервера и (необязательно) порт; для одних серверов вы будете использовать системную аутентификацию, для других - кортеж пароля пользователя.

Сказав, что я дам вам небольшой демо-скрипт Inno, который запрашивает имя сервера и порт, имя пользователя и пароль, затем делает несколько тестов, затем запускает приложение, которое извлекается (по коду) в каталог темпа и будет удален инсталлятором. Вы можете использовать это в качестве отправной точки для ваших скриптов. Имея несколько таких фрагментов и включив их по мере необходимости в ваши скрипты, вероятно, будет всё, что вам нужно:

[Setup]
AppID=DBUpdateTest
AppName=Test
AppVerName=Test 0.1
AppPublisher=My Company, Inc.
DefaultDirName={pf}\Test
DefaultGroupName=Test
DisableDirPage=yes
DisableProgramGroupPage=yes
OutputBaseFilename=setup
PrivilegesRequired=none

[Files]
Source: "isql.exe"; DestDir: "{tmp}"; Flags: dontcopy
Source: "update_V42.sql"; DestDir: "{tmp}"; Flags: dontcopy

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Code]
var
  DBPage: TInputQueryWizardPage;

procedure InitializeWizard;
begin
  DBPage := CreateInputQueryPage(wpReady,
    'Database Connection Information', 'Which database is to be updated?',
    'Please specify the server and the connection credentials, then click Next.');
  DBPage.Add('Server:', False);
  DBPage.Add('Port:', False);
  DBPage.Add('User name:', False);
  DBPage.Add('Password:', True);

  DBPage.Values[0] := GetPreviousData('Server', '');
  DBPage.Values[1] := GetPreviousData('Port', '');
  DBPage.Values[2] := GetPreviousData('UserName', '');
  DBPage.Values[3] := GetPreviousData('Password', '');
end;

procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
  SetPreviousData(PreviousDataKey, 'Server', DBPage.Values[0]);
  SetPreviousData(PreviousDataKey, 'Port', DBPage.Values[1]);
  SetPreviousData(PreviousDataKey, 'UserName', DBPage.Values[2]);
  SetPreviousData(PreviousDataKey, 'Password', DBPage.Values[3]);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ResultCode: Integer;
begin
  Result := True;
  if CurPageID = DBPage.ID then begin
    if DBPage.Values[0] = '' then begin
      MsgBox('You must enter the server name or address.', mbError, MB_OK);
      Result := False;
    end else if DBPage.Values[2] = '' then begin
      MsgBox('You must enter the user name.', mbError, MB_OK);
      Result := False;
    end else if DBPage.Values[3] = '' then begin
      MsgBox('You must enter the user password.', mbError, MB_OK);
      Result := False;
    end else begin
      ExtractTemporaryFile('isql.exe');
      ExtractTemporaryFile('update_V42.sql');
      if Exec(ExpandConstant('{tmp}') + '\isql.exe', '--user ' + DBPage.Values[2]
        + ' --password ' + DBPage.Values[3] + ' --database ' + DBPage.Values[0]
        + ':foo --script update_V42.sql', '',
        SW_HIDE, ewWaitUntilTerminated, ResultCode)
      then begin
        // check ResultCode and set Result accordingly
        Result := ResultCode = 0;
      end else begin
        MsgBox('Database update failed:'#10#10 + SysErrorMessage(ResultCode),
          mbError, MB_OK);
        Result := False;
      end;
    end;
  end;
end;

Остерегайтесь: я не полностью протестировал это, так что может быть больше кода, необходимого для правильной чистки всего. Обработка ошибок определенно отсутствует!

11
ответ дан 3 December 2019 в 09:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: