2010-01-31 22 views
11

Chciałbym skompilować konfigurację, która połączy się ze zdalną bazą danych przy użyciu poświadczeń dostarczonych przez użytkownika, a następnie zainstaluje kilka składników bazy danych przy użyciu skryptu .sql.Jak używać Inno Setup do aktualizacji bazy danych przy użyciu skryptu .sql

Czy to możliwe przy użyciu Inno Setup?

Więcej szczegółów:

Chciałbym mieć formę niestandardowej, prosząc użytkownika o podanie adresu do bazy danych i poświadczeń, a następnie uruchomić polecenie, które będzie wykonywał skrypt SQL, która będzie zaktualizować zdalnego serwera bazy danych.

Jeśli aktualizacja zakończy się pomyślnie - zakończ instalację pomyślnie.

To raczej ogólne pytanie - mam wiele spersonalizowanych konfiguracji, które powinny łączyć się z różnymi serwerami/uruchamiać różne skrypty - chodzi o zbudowanie ogólnej postaci, która zapewni tę funkcjonalność.

+1

To na pewno możliwe, ale bez dalszych informacji trudno jest udzielić sensownej odpowiedzi. Jakie jest Twoje pytanie? Czy już próbowałeś to zrobić? Jaka baza danych? Proszę wyjaśnić ... – mghie

+0

cóż, chodzi o to, żeby mieć ogólną formę - szczegóły powyżej .. – ofer

Odpowiedz

11

Nie sądzę, że możesz mieć całkowicie ogólną formę, ponieważ dla różnych serwerów możesz potrzebować jednego ciągu połączenia lub nazwy serwera i (opcjonalnego) portu; dla niektórych serwerów będziesz używał uwierzytelniania systemu, dla innych - tupty hasła użytkownika.

Powiedziawszy, że dam ci mały skrypt demonstracyjny Inno, który prosi o nazwę serwera i port, nazwę użytkownika i hasło, następnie wykonuje kilka testów, a następnie wykonuje aplikację, która jest wyodrębniana (przez kod) do katalogu tymczasowego i zostaną usunięte przez instalatora. Możesz użyć tego jako punktu wyjścia dla swoich skryptów. Mając kilka takich fragmentów, a włączenie ich w skryptach jak konieczne będzie prawdopodobnie wszystko, czego potrzebujesz:

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

Uwaga: Nie w pełni przetestowane, więc nie może być więcej kodu niezbędne do prawidłowego czyste wszystko w górę. Obsługa błędów zdecydowanie nie istnieje!

+0

Albo możesz użyć interfejsu COM ['like ADODB'] (http://stackoverflow.com/a/12296113/960757) na przykład. – TLama

+0

@TLama: Możesz oczywiście, jeśli twój serwer bazy danych zapewnia tego rodzaju interfejs. Powyższy przykład został zaczerpnięty z podobnego kodu, którego używam w Firebird. – mghie

+0

Używany ten kod dla MSSQL 2008, ale zamiast isql używany sqlcmd.exe. –

Powiązane problemy