Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Inno Setup to update a database using .sql script

Tags:

sql

inno-setup

I'd like to compile a setup that will connect to a remote database using the credentials provided by the user, then install few db components using .sql script.

Is that possible using Inno Setup?

More details:

I'd like to have a custom form, asking the user to enter the database address and credentials, then run a command that will execute an sql script that will update the remote database server.

If the update is successful - complete the installation with success.

This is rather general question - I have a lot of customized setups that should connect to different servers/run different scripts - the idea is to build a generic form that will provide this functionality.

like image 235
ofer Avatar asked Jan 31 '10 09:01

ofer


People also ask

Is it possible to update a remote database using Inno Setup?

Is that possible using Inno Setup? I'd like to have a custom form, asking the user to enter the database address and credentials, then run a command that will execute an sql script that will update the remote database server. If the update is successful - complete the installation with success.

Can I install MS SQL Server via InnoSetup?

You have to check if SQL Server instance exists and if it does not exists, skip installation process with message: "Please install MS SQL Server (2008 and up) first!". Please Sign up or sign in to vote. Please, read my comment to the question first. Note: i do not recommend to install MS SQL Server via InnoSetup for set of reason. Two of them are:

How do I use Inno script studio with my existing project?

You can use any of your existing project. Compile the project in release configuration. Go to Start->All Programs. You will see Inno setup 5 & Inno Script Studio installed here. Click Inno Script Studio. This will bring up the new project wizard as in the following image. Create a new script using the script wizard. Click Ok

How do I create an Inno Setup file?

You can create a text file in notepad and select the files here. Click on next once finished. The Next screen is language selection. Select the languages supported. Click on next to bring up the Compiler Settings. Select the output folder for the setup file. Click on Next> Next screen is Inno Setup Preprocessor.


1 Answers

I don't think you can have a completely generic form, as for different servers you may need either a single connection string, or a server name and an (optional) port; for some servers you will use system authentication, for others a user name password tuple.

Having said that I will give you a small demo Inno script that asks for server name and port, user name and password, then makes a few tests, then executes an application that is extracted (by code) to the temp directory and will be deleted by the installer. You can use this as a starting point for your scripts. Having a few of such snippets, and including them in your scripts as necessary will probably be all you need:

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

Beware: I haven't fully tested this, so there may be more code necessary to properly clean everything up. Error handling is definitely missing!

like image 129
mghie Avatar answered Sep 23 '22 01:09

mghie