2010-01-31 9 views
11

zu aktualisieren ich ein Setup kompilieren möchte, die zu einer entfernten Datenbank verbinden die Anmeldeinformationen durch den Benutzer zur Verfügung gestellt verwenden, installieren Sie dann einige db Komponenten .sql-Skript.Wie Inno Setup verwenden, um eine Datenbank mit SQL-Skript

Ist das mit Inno Setup möglich?

Weitere Details:

Ich mag eine eigene Form haben, die den Benutzer auffordert, die Datenbank-Adresse und Anmeldeinformationen eingeben, dann einen Befehl ausführen, die eine SQL-Skript wird ausgeführt, dass der Remote-Datenbankserver aktualisiert.

Wenn das Update erfolgreich ist - die Installation mit Erfolg abzuschließen.

Dies ist eher allgemeine Frage - ich habe eine Menge von kundenspezifischen Konfigurationen, die auf verschiedenen Servern/laufen verschiedene Scripts verbinden sollte - die Idee ist, eine generische Form zu bauen, die diese Funktionalität bereitstellen.

+1

Es ist sicherlich möglich, aber ohne weitere Informationen ist es schwer, eine sinnvolle Antwort zu geben. Was ist deine Frage? Hast du es schon versucht? Welche Datenbank? Bitte klären ... – mghie

+0

gut, die Idee ist, eine generische Form zu haben - Details über .. – ofer

Antwort

11

Das glaube ich nicht, dass Sie eine völlig generische Form haben können, wie für verschiedene Server, die Sie entweder eine einzelne Verbindungszeichenfolge benötigen, oder einen Servernamen und ein (optional) Port; Für einige Server verwenden Sie die Systemauthentifizierung, für andere Server einen Benutzernamen tuple.

Nachdem ich gesagt habe, werde ich Ihnen ein kleines Demo-Inno-Skript geben, das nach Servername und Port, Benutzername und Passwort fragt, dann ein paar Tests durchführt und dann eine Anwendung ausführt, die (nach Code) in das temporäre Verzeichnis extrahiert wird und wird vom Installer gelöscht. Sie können dies als Ausgangspunkt für Ihre Skripts verwenden. ein paar solcher Schnipsel zu haben, und sie in Ihren Skripten als notwendig werden alle wahrscheinlich benötigen Sie:

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

Vorsicht: Ich habe dies nicht vollständig getestet, so kann es mehr Code notwendig sind, um alles sauber sein oben. Fehlerbehandlung fehlt definitiv!

+0

Oder Sie können eine COM-Schnittstelle verwenden [ 'wie ADODB'] (http://stackoverflow.com/a/12296113/960757) zum Beispiel. – TLama

+0

@TLama: Sie können natürlich, wenn Ihr Datenbankserver diese Art von Schnittstelle bietet. Das obige Beispiel wurde jedoch von einem ähnlichen Code übernommen, den ich für Firebird verwende. – mghie

+0

Dieser Code wurde für MSSQL 2008 verwendet, aber anstelle von isql wurde sqlcmd.exe verwendet. –

Verwandte Themen