如何使用Inno Setup使用.sql脚本更新数据库 [英] How to use Inno Setup to update a database using .sql script
问题描述
我想编译一个安装程序,该安装程序将使用用户提供的凭据连接到远程数据库,然后使用.sql脚本安装一些数据库组件.
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.
使用Inno Setup可以吗?
Is that possible using Inno Setup?
更多详细信息:
我想要一个自定义表单,要求用户输入数据库地址和凭据,然后运行将执行sql脚本的命令,该脚本将更新远程数据库服务器.
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.
推荐答案
我不认为您可以使用完全通用的形式,因为对于不同的服务器,您可能需要一个连接字符串,或者一个服务器名称和一个(可选)端口;对于某些服务器,您将使用系统身份验证,对于其他服务器,则使用用户名密码元组.
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.
已经说过,我将为您提供一个小样的Inno演示脚本,该脚本询问服务器名称和端口,用户名和密码,然后进行一些测试,然后执行(通过代码)提取到temp目录的应用程序,并将被安装程序删除.您可以将其用作脚本的起点.拥有一些这样的代码片段,并在需要时将其包含在脚本中可能就是您所需要的:
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!
这篇关于如何使用Inno Setup使用.sql脚本更新数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!