2016-12-19 11 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 Server 버전에 대한 정보를 찾습니다. 이 방법에는 여러 가지 가능한 실패 문제가 있습니다. 그러나 레지스트리 솔루션보다 훨씬 낫습니다.

레지스트리 키가 어떤 이유로 든 손상된 경우 대체 솔루션을 검색했습니다.

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을 사용하고 있음을 알 수 있습니다. 유니 코드 버전으로 업그레이드해야합니다. 어쨌든 +1하십시오. –