非常感谢Mitch提出的出色答案。但是,我最终完成的工作如下:
我有两种单独的方法分别获取本地和远程服务器实例。从注册表中检索本地实例。您需要同时搜索WOW64和WOW3264配置单元,才能同时获得SQL Server
2008(64位)和SQL Server Express(32位)
这是我使用的代码:
/// <summary> /// get local sql server instance names from registry, search both WOW64 and WOW3264 hives /// </summary> /// <returns>a list of local sql server instance names</returns> public static IList<string> GetLocalSqlServerInstanceNames() { RegistryValueDataReader registryValueDataReader = new RegistryValueDataReader(); string[] instances64Bit = registryValueDataReader.ReadRegistryValueData(RegistryHive.Wow64,Registry.LocalMachine,@"SOFTWAREMicrosoftMicrosoft SQL Server","InstalledInstances"); string[] instances32Bit = registryValueDataReader.ReadRegistryValueData(RegistryHive.Wow6432,Registry.LocalMachine,@"SOFTWAREMicrosoftMicrosoft SQL Server","InstalledInstances"); FormatLocalSqlInstanceNames(ref instances64Bit); FormatLocalSqlInstanceNames(ref instances32Bit); IList<string> localInstanceNames = new List<string>(instances64Bit); localInstanceNames = localInstanceNames.Union(instances32Bit).ToList(); return localInstanceNames; }
public enum RegistryHive{ Wow64, Wow6432}public class RegistryValueDataReader{ private static readonly int KEY_WOW64_32KEY = 0x200; private static readonly int KEY_WOW64_64KEY = 0x100; private static readonly UIntPtr HKEY_LOCAL_MACHINE = (UIntPtr)0x80000002; private static readonly int KEY_QUERY_VALUE = 0x1; [Dllimport("advapi32.dll", CharSet = CharSet.Unipre, EntryPoint = "RegOpenKeyEx")] static extern int RegOpenKeyEx( UIntPtr hKey, string subKey, uint options, int sam, out IntPtr phkResult); [Dllimport("advapi32.dll", SetLastError = true)] static extern int RegQueryValueEx( IntPtr hKey, string lpValueName, int lpReserved, out uint lpType, IntPtr lpData, ref uint lpcbData); private static int GetRegistryHiveKey(RegistryHive registryHive) { return registryHive == RegistryHive.Wow64 ? KEY_WOW64_64KEY : KEY_WOW64_32KEY; } private static UIntPtr GetRegistryKeyUIntPtr(RegistryKey registry) { if (registry == Registry.LocalMachine) { return HKEY_LOCAL_MACHINE; } return UIntPtr.Zero; } public string[] ReadRegistryValueData(RegistryHive registryHive, RegistryKey registryKey, string subKey, string valueName) { string[] instanceNames = new string[0]; int key = GetRegistryHiveKey(registryHive); UIntPtr registryKeyUIntPtr = GetRegistryKeyUIntPtr(registryKey); IntPtr hResult; int res = RegOpenKeyEx(registryKeyUIntPtr, subKey, 0, KEY_QUERY_VALUE | key, out hResult); if (res == 0) { uint type; uint dataLen = 0; RegQueryValueEx(hResult, valueName, 0, out type, IntPtr.Zero, ref dataLen); byte[] databuff = new byte[dataLen]; byte[] temp = new byte[dataLen]; List<String> values = new List<string>(); GCHandle handle = GCHandle.Alloc(databuff, GCHandleType.Pinned); try {RegQueryValueEx(hResult, valueName, 0, out type, handle.AddrOfPinnedObject(), ref dataLen); } finally {handle.Free(); } int i = 0; int j = 0; while (i < databuff.Length) {if (databuff[i] == ''){ j = 0; string str = Encoding.Default.GetString(temp).Trim(''); if (!string.IsNullOrEmpty(str)) { values.Add(str); } temp = new byte[dataLen];}else{ temp[j++] = databuff[i];}++i; } instanceNames = new string[values.Count]; values.CopyTo(instanceNames); } return instanceNames; }}SqlDataSourceEnumerator.Instance.GetDataSources() is used to get remote sql server instances.
最后,我只是合并了远程实例列表和本地实例列表以产生最终结果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)