2016-12-19 2 views
0

私は、動作するための前提条件として、SQL Server 2014(またはそれ以降)LocalDB(または、express、standard、何でも)を必要とするアプリケーションを開発しています。そして私はInno Setupを使って私のアプリのインストーラをビルドしています。SQL Serverのインストールを検出する方法?

私はInno SetupでSqlLocalDBをインストールしたくありません。アプリケーションをインストールするためにインストールする必要があることをユーザーに知らせたいだけです。

ここにはいくつかのトピックがありますが、そのほとんどはレジストリを調べて調べるべきだと説明しています。しかし、それぞれが異なるキーを提案し、私は本当に混乱しています。さらに、自分のレジストリは完全に異なります!

私はこのようなものが必要です。

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

ありがとうございます。

+1

が重複する可能性を比較したいと思います あなたはバージョンを確認するための番号を変更する必要があります[SQL Serverのバージョンを確認する方法](http://stackoverflow.com/questions/20351674/how-to -check-sql-server-version) – 3N1GM4

+2

LocallDBの情報はこちら:http://stackoverflow.com/questions/11628316/sql2012-localdb-how-to-check-in-c-sharp-if-it-is-currently -installed/11629024#11629024 – ErikEJ

+0

あなたは、この質問を扱う既存のトピックがあることを知っています。それらが間違っている/不満足であると分かった場合は、あなたに何が間違っているのかを説明しなければなりません。それ以外の場合、あなたの質問は重複しているだけです。 –

答えて

2

WMIを使用して、インストールされているSQLサーバーのバージョンに関する情報を検索します。この方法でも失敗の可能性があるさまざまな問題があります。しかし、レジストリソリューションよりはるかに優れています。

レジストリキーが何らかの理由で妥協された場合、私は代替ソリューションをフォールバックとして検索しました。

GetWmiNameSpace

SQLサーバノードの下で利用可能な名前空間のリストを取得します。あなたは、さらに詳細に

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; 
+1

コード内にセミコロンがない場合は、古いAnsiバージョンのInno Setupを使用していることが示唆されています。 Unicodeバージョンにアップグレードする必要があります。とにかく+1。 –

関連する問題