我想编译一个安装程序,该安装程序将使用用户提供的凭据连接到远程数据库,然后使用.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;
请注意:我尚未对此进行全面测试,因此可能需要更多代码才能正确清理所有内容。错误处理肯定会丢失!
问题内容: 我在表的一列中有XML ,并且我需要使用新值而不是0.00更新元素,并且使用两个不同值而不是空白的和元素来更新。 例如: 这是我在专栏中的XML: 这是我尝试过的: 我收到一个错误: 消息9341,级别16,状态1,第4行 XQuery [XYZ.XmlPayload.modify()]:“)”附近的语法错误,应包含步骤表达式 问题答案: 我认为这是一个很好的问题,因为它提出了一个有趣
问题内容: 我有一个上面带有Web表单的网页。该表单已预填充了SQL Server数据库中的数据。用户可以进入并编辑任何字段,然后单击底部的“保存”按钮以更新数据库中的记录。由于某种原因,当我将表格预先填充数据时,update语句不会更新数据库中的记录。如果我删除了页面加载方法上预先填写表单的代码,则update语句将按预期工作。当我在页面加载方法中用数据预先填充表单时,update语句似乎正在使
问题内容: 我正在用C#编写Winforms应用程序,该应用程序使用户可以使用datagridview编辑和更新数据库。 问题是,我无法使其正常工作。我唯一要实现的就是更新datagridview所显示的内容,但是当我进入数据库表时,数据没有任何变化。我搜索了很多讨论该问题的站点,但对我来说仍然没有任何用处。 到目前为止我尝试过的事情: 将数据库绑定到datagridview 将属性更改为 使用带
我想用Pyglet制作一个每帧都在变化的网格。因此,我需要经常更新顶点,我认为VBO是最快的方法(如果我错了,请纠正我)。下面是一个要点示例。这是正确的做法吗?我读到应该尽量减少glBindBuffer调用的数量,但在这里它是每帧调用一次的。此外,启用了GL_DYNAMIC_DRAW,但如果我将其更改为GL_STATIC_DRAW,它仍在工作。这让我想知道这是否是一个快速计算的正确设置
问题内容: 我有一个包含一千万行的表,需要与另一个表连接并更新所有数据。一小时要花费超过1个小时的时间,这使我的事务日志增加了10+ GB。是否有另一种方法可以增强此性能? 我相信,每次更新后,都会检查索引和约束并记录所有信息。有没有一种方法可以告诉SQL Server仅在更新完成后才检查约束并最小化记录更新操作? 我的查询如下。我已经修改了一些名称,以便于阅读。 编辑: 如注释中所述,表定义将类
这个问题几乎说明了一切。使用JPARepository,我如何更新一个实体? JPARepository只有一个save方法,它并不告诉我它实际上是create还是update。例如,我向数据库用户插入一个简单的对象,它有三个字段:、和: 然后我只需调用,此时它实际上是对数据库的插入: 到目前为止还不错。现在我想更新这个用户,比如说改变他的年龄。为此,我可以使用查询,无论是QueryDSL还是Na