我想编译一个安装程序,该安装程序将使用用户提供的凭据连接到远程数据库,然后使用.sql脚本安装一些数据库组件。
使用Inno Setup可以做到吗?
更多细节:
我想要一个自定义表单,要求用户输入数据库地址和凭据,然后运行将执行sql脚本的命令,该脚本将更新远程数据库服务器。
如果更新成功-成功完成安装。
这是一个相当普遍的问题-我有很多定制的设置应连接到不同的服务器/运行不同的脚本-的想法是建立将提供此功能的通用形式。
我认为您无法采用完全通用的形式,因为对于不同的服务器,您可能需要一个连接字符串,一个服务器名称和一个(可选)端口;对于某些服务器,您将使用系统身份验证,对于其他服务器,则使用用户名密码元组。
话虽如此,我将为您提供一个小样的Inno演示脚本,该脚本询问服务器名称和端口,用户名和密码,然后进行一些测试,然后执行(通过代码)提取到temp目录并将被删除的应用程序由安装程序。您可以将其用作脚本的起点。拥有一些这样的代码片段,并在必要时将其包含在脚本中可能就是您所需要的:
[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;
请注意:我尚未对此进行全面测试,因此可能需要更多代码才能正确清理所有内容。错误处理肯定会丢失!