【问题标题】:How to detect SQL Server installation?如何检测 SQL Server 安装?
【发布时间】:2017-05-04 12:15:01
【问题描述】:

我正在开发一个应用程序,它需要 SQL Server 2014(或更高版本)LocalDB(或表达、标准,等等!)作为工作的先决条件。我正在使用 Inno Setup 为我的应用构建安装程序。

我不想使用 Inno Setup 安装 SqlLocalDB,我只想通知用户他需要安装它才能使应用程序正常工作。

这里和其他地方有一些主题,其中大多数都解释说我应该查看注册表以找到它。但是每个人都建议不同的键,我真的很困惑。另外,我自己的注册表完全不一样!

我需要这样的东西;

If (SQLServer2014ExpressOrNewerInstalled) then
    result := true;
else if (SQLServer2014LocalDBOrNewerInstalled) then
    result := true;
else
    result := false;

提前致谢。

【问题讨论】:

标签: sql-server inno-setup localdb


【解决方案1】:

使用 WMI 查找有关安装的 SQL Server 版本的信息。这种方法也存在各种可能的失败问题。但比注册表解决方案要好得多。

如果注册表项因任何原因遭到破坏,我已寻找替代解决方案作为备用解决方案。

获取WmiNameSpace

获取 SQL Server 节点下可用的命名空间列表。限定您希望返回到 GetSqlServerValidationResults 以获取更多信息的命名空间

GetSqlServerValidationResults

实际版本检查功能。我非常有兴趣获得一个名称值对以避免函数中的 if 条件膨胀。由于时间限制,无法分配更多时间来更改名称值列表。 您可能需要更改数字以检查您要比较的版本

function GetWmiNameSpace(): String;
var
  oWMI, oServer, oProvider, oInstances, collSubNamespaces: Variant;
  i: Integer;
  item: Variant;
begin
  oWMI := CreateOleObject('wbemScripting.SWbemLocator'); 
  oServer := oWMI.ConnectServer('.', 'root/Microsoft/sqlserver');
  collSubNamespaces  := oServer.ExecQuery('select * from __namespace');
  for i := 0 to collSubNamespaces.Count - 1 do
  begin
    item := collSubNamespaces.ItemIndex[i];
    if Pos('ComputerManagement', item.Name) = 1 then Result := item.Name;
    Log('Namespaces are ' + item.Name);
  end; 
end;  

function GetSqlServerValidationResults(): String;
var
  Query: string;
  WbemLocator, WbemServices, WbemObjectSet: Variant;
  server: Variant;
  I: Integer;
  versions: TStringList;
begin
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WbemServices :=
    WbemLocator.ConnectServer(
      '.', 'root\Microsoft\SqlServer\' + GetWmiNameSpace());
  Query := 'SELECT * FROM SqlServiceAdvancedProperty';
  WbemObjectSet := WbemServices.ExecQuery(Query);
  if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
  begin
    for I := 0 to WbemObjectSet.Count - 1 do
    begin
      server := WbemObjectSet.ItemIndex(I);
      if not VarIsNull(server) then
      begin
        if server.PropertyName = 'VERSION' then
        begin
            Log('Name' + server.PropertyName);
            if not VarIsNull(server.PropertyStrValue) then 
            begin
              Log('value ==> ' + server.PropertyStrValue + '[' +
                IntToStr(pos('13.0.',server.PropertyStrValue)));
              if pos('10.0.', server.PropertyStrValue) = 1 then Result  := '2008';
              if pos('10.5', server.PropertyStrValue) = 1 then Result  := '2008R2';
              if pos('11.0.', server.PropertyStrValue) = 1 then Result  := '2012';
              if pos('12.0.', server.PropertyStrValue) = 1 then Result  := '2014';
              if pos('13.0.', server.PropertyStrValue) = 1 then Result  := '2016';
            end;
        end;        
      end;
    end;
  end;
end;

【讨论】:

  • 您的代码中缺少分号表明您使用的是 Inno Setup 的旧 Ansi 版本,它可以容忍它们。您应该升级到 Unicode 版本。无论如何 +1。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多