【解決方法】C# を使用してローカル SQL サーバー インスタンスを取得する

プログラミングQA

[ad_1]

私は次の方法を使用してみました

DataTable dataTable = SmoApplication.EnumAvailableSqlServers(true);

            foreach (DataRow dataRow in dataTable.Rows)
            {
                Console.WriteLine(dataRow["Instance"] as string);
            }

データテーブルにはインスタンス名はありませんが、システム名のみがあります。

DataTable dt = SqlDataSourceEnumerator.Instance.GetDataSources();
            foreach (System.Data.DataRow row in dt.Rows)
            {
                foreach (System.Data.DataColumn col in dt.Columns)
                {
                   Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
                }
            }

同上、

there are no instance names in datatable but there are only system names.

管理されたコンピューターも使用してみましたが、win-8で例外がスローされます

私の要件は、SqlExpress インスタンスが既にシステムに存在するかどうかを確認することです。存在しない場合は、Sqlexpress インスタンスを使用して SQL Server をインストールします。

私が試したこと:

i tried using Managed computer also but i throws exception in win-8

My requirement is to check if there is an instance with name SqlExpress already in system, if its not there then install sql server with Sqlexpress Instance.

解決策 1

EnumAvailableSqlServersSqlDataSourceEnumerator SQL Server Browser サービスが実行されている場合、名前付きインスタンスのみが検索されます。

ManagedComputer SQL Server Management Studio に登録されているサーバーのみが検索されます。

現在のコンピューターでサーバーを探しているだけの場合は、レジストリから情報を読み取ることができます。 キー HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server と呼ばれる値を持っています。 InstalledInstances これには、ローカル コンピューターにインストールされている SQL Server インスタンスの名前が含まれています。

C#
public static class SqlHelper
{
    public static IEnumerable<string> ListLocalSqlInstances()
    {
        if (Environment.Is64BitOperatingSystem)
        {
            using (var hive = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
            {
                foreach (string item in ListLocalSqlInstances(hive))
                {
                    yield return item;
                }
            }
            
            using (var hive = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
            {
                foreach (string item in ListLocalSqlInstances(hive))
                {
                    yield return item;
                }
            }
        }
        else
        {
            foreach (string item in ListLocalSqlInstances(Registry.LocalMachine))
            {
                yield return item;
            }
        }
    }
    
    private static IEnumerable<string> ListLocalSqlInstances(RegistryKey hive)
    {
        const string keyName = @"Software\Microsoft\Microsoft SQL Server";
        const string valueName = "InstalledInstances";
        const string defaultName = "MSSQLSERVER";
        
        using (var key = hive.OpenSubKey(keyName, false))
        {
            if (key == null) return Enumerable.Empty<string>();
            
            var value = key.GetValue(valueName) as string[];
            if (value == null) return Enumerable.Empty<string>();
            
            for (int index = 0; index < value.Length; index++)
            {
                if (string.Equals(value[index], defaultName, StringComparison.OrdinalIgnoreCase))
                {
                    value[index] = ".";
                }
                else
                {
                    value[index] = @".\" + value[index];
                }
            }
            
            return value;
        }
    }
}

解決策 2

これを試してください、このコードはより速く実行されます

string ServerName = Environment.MachineName;
           Microsoft.Win32.RegistryView registryView = Environment.Is64BitOperatingSystem ? Microsoft.Win32.RegistryView.Registry64 : Microsoft.Win32.RegistryView.Registry32;
           using (Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, registryView))
           {
               Microsoft.Win32.RegistryKey instanceKey = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", false);
               if (instanceKey != null)
               {
                   foreach (var instanceName in instanceKey.GetValueNames())
                   {
                       if (instanceName == "MSSQLSERVER")
                       {
                           cmbServerName.Items.Add(ServerName);

                       }
                       else
                       {
                           cmbServerName.Items.Add(ServerName + "\\" + instanceName);
                       }
                   }
               }
           }

[ad_2]

コメント

タイトルとURLをコピーしました