2010-01-31 14 views
11

Vorrei compilare un'installazione che si connetterà a un database remoto utilizzando le credenziali fornite dall'utente, quindi installare alcuni componenti db utilizzando lo script .sql.Come utilizzare Inno Setup per aggiornare un database utilizzando lo script .sql

È possibile utilizzare Inno Setup?

Maggiori dettagli:

mi piacerebbe avere un modulo personalizzato, che chiede all'utente di inserire l'indirizzo del database e le credenziali, quindi eseguire un comando che verrà eseguito uno script SQL che aggiornerà il server di database remoto.

Se l'aggiornamento ha esito positivo, completare l'installazione con esito positivo.

Questa è una domanda piuttosto generale: ho molte configurazioni personalizzate che dovrebbero connettersi a server diversi/eseguire script diversi: l'idea è di creare un modulo generico che fornisca questa funzionalità.

+1

È sicuramente possibile, ma senza ulteriori informazioni è difficile dare una risposta significativa. Qual è la tua domanda? Hai già provato a farlo? Quale database? Si prega di chiarire ... – mghie

+0

beh, l'idea è di avere una forma generica - dettagli sopra .. – ofer

risposta

11

Non penso che sia possibile avere un modulo completamente generico, poiché per server diversi potrebbe essere necessaria una singola stringa di connessione o un nome di server e una porta (facoltativa); per alcuni server si utilizzerà l'autenticazione di sistema, per altri una tupla di password per nome utente.

Detto questo, vi fornirò un piccolo script Inno demo che richiede nome server e porta, nome utente e password, quindi esegue alcuni test, quindi esegue un'applicazione che viene estratta (dal codice) nella directory temporanea e sarà cancellato dall'installatore. Puoi usare questo come punto di partenza per i tuoi script. Avere un paio di tali frammenti, e la loro inclusione negli script, se necessario sarà probabilmente tutto ciò che serve:

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

Attenzione: non ho completamente testato questo, quindi ci possono essere più codice necessario per pulire correttamente tutto su. Manca la gestione degli errori!

+0

Oppure si può usare un'interfaccia COM ['come ADODB'] (http://stackoverflow.com/a/12296113/960757) per esempio. – TLama

+0

@TLama: Ovviamente è possibile che il proprio server di database fornisca quel tipo di interfaccia. Sopra l'esempio tuttavia è stato preso dal codice simile che uso per Firebird. – mghie

+0

Utilizzato questo codice per MSSQL 2008, ma invece di isql utilizzato sqlcmd.exe. –

Problemi correlati