我想编译一个使用用户提供的凭据连接到远程数据库的安装程序,然后使用.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;