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;
が重複する可能性を比較したいと思います あなたはバージョンを確認するための番号を変更する必要があります[SQL Serverのバージョンを確認する方法](http://stackoverflow.com/questions/20351674/how-to -check-sql-server-version) – 3N1GM4
LocallDBの情報はこちら:http://stackoverflow.com/questions/11628316/sql2012-localdb-how-to-check-in-c-sharp-if-it-is-currently -installed/11629024#11629024 – ErikEJ
あなたは、この質問を扱う既存のトピックがあることを知っています。それらが間違っている/不満足であると分かった場合は、あなたに何が間違っているのかを説明しなければなりません。それ以外の場合、あなたの質問は重複しているだけです。 –