2010-01-31 30 views
11

Me gustaría compilar una configuración que se conectará a una base de datos remota utilizando las credenciales proporcionadas por el usuario, luego instalar algunos componentes db utilizando la secuencia de comandos .sql.Cómo usar Inno Setup para actualizar una base de datos usando la secuencia de comandos .sql

¿Es posible usar Inno Setup?

Más detalles:

Me gustaría tener un formulario personalizado, que pide al usuario que introduzca la dirección de base de datos y credenciales, a continuación, ejecutar un comando que se ejecutará una secuencia de comandos SQL que va a actualizar el servidor de base de datos remota.

Si la actualización es exitosa, complete la instalación con éxito.

Esta es una pregunta bastante general - Tengo muchas configuraciones personalizadas que deben conectarse a diferentes servidores/ejecutar diferentes scripts - la idea es crear un formulario genérico que proporcione esta funcionalidad.

+1

Seguramente es posible, pero sin más información es difícil dar una respuesta significativa. ¿Cuál es tu pregunta? ¿Ya trataste de hacerlo? ¿Qué base de datos? Por favor, aclare ... – mghie

+0

Bueno, la idea es tener una forma genérica - detalles anteriores .. – ofer

Respuesta

11

No creo que pueda tener una forma completamente genérica, ya que para diferentes servidores puede necesitar una sola cadena de conexión, o un nombre de servidor y un puerto (opcional); para algunos servidores usarás la autenticación del sistema, para otros una tupla de contraseña del nombre de usuario.

Habiendo dicho que le daré una pequeña demo de la secuencia de comandos Inno que solicita el nombre del servidor y el puerto, nombre de usuario y contraseña, luego realiza algunas pruebas y luego ejecuta una aplicación que se extrae (por código) al directorio temporal y será eliminado por el instalador. Puede usar esto como punto de partida para sus scripts. Tener unos pocos de tales fragmentos, y su inclusión en las secuencias de comandos, según sea necesario, probablemente, va a ser todo lo que necesita:

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

cuidado: no he probado esto completamente, por lo que puede ser más adecuada código necesario para limpiar todo arriba. ¡El manejo de errores definitivamente no se encuentra!

+0

O puede utilizar una interfaz COM ['como ADODB'] (http://stackoverflow.com/a/12296113/960757) por ejemplo. – TLama

+0

@TLama: puede, por supuesto, si su servidor de base de datos proporciona ese tipo de interfaz. Por encima del ejemplo, sin embargo, fue tomado del código similar que uso para Firebird. – mghie

+0

Usó este código para MSSQL 2008, pero en lugar de isql usó sqlcmd.exe. –

Cuestiones relacionadas