如何使用Inno安装程序使用.sql脚本更新数据库

前端之家收集整理的这篇文章主要介绍了如何使用Inno安装程序使用.sql脚本更新数据库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想编译一个使用用户提供的凭据连接到远程数据库的安装程序,然后使用.sql脚本安装几个db组件.

是否可以使用Inno Setup?

更多细节:

我想要一个自定义表单,要求用户输入数据库地址和凭据,然后运行一个将执行更新远程数据库服务器的sql脚本的命令.

如果更新成功 – 成功完成安装.

这是一个相当普遍的问题 – 我有很多自定义的设置,应该连接到不同的服务器/运行不同的脚本 – 想法是建立一个通用的表单,将提供这个功能.

解决方法

我不认为你可以有一个完全通用的形式,对于不同的服务器,您可能需要单个连接字符串,或服务器名称和(可选)端口;对于某些服务器,您将使用系统身份验证,对于其他服务器,您可以使用用户名密码元组.

说完我会给你一个小的演示Inno脚本,要求服务器名称和端口,用户名和密码,然后进行一些测试,然后执行一个应用程序(通过代码)提取到临时目录并将被删除由安装人员您可以使用它作为脚本的起点.拥有一些这样的片段,并在必要时将它们包含在您的脚本中可能将是您需要的:

[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.',MB_OK);
      Result := False;
    end else if DBPage.Values[3] = '' then begin
      MsgBox('You must enter the user password.',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),MB_OK);
        Result := False;
      end;
    end;
  end;
end;

当心:我还没有完全测试这个,所以可能需要更多的代码来适当地清理所有的东西.错误处理绝对是错误的!

猜你在找的Delphi相关文章