如何在C#中枚举网络中的可用数据库服务(SQLSewrver或Oracle或MySQL或PostgreSQL等)?

前端之家收集整理的这篇文章主要介绍了如何在C#中枚举网络中的可用数据库服务(SQLSewrver或Oracle或MySQL或PostgreSQL等)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何使用C#枚举网络中的可用数据库服务(sql Server或Oracle或 MySQL或Postgresql等)?

我还需要找到他们的端口号和服务实例名称.

例如:

  1. class Server
  2. {
  3. #region DLL Inports
  4. [DllImport("odbc32.dll")]
  5. private static extern short sqlAllocHandle(short hType,IntPtr inputHandle,out IntPtr outputHandle);
  6. [DllImport("odbc32.dll")]
  7. private static extern short sqlSetEnvAttr(IntPtr henv,int attribute,IntPtr valuePtr,int strLength);
  8. [DllImport("odbc32.dll")]
  9. private static extern short sqlFreeHandle(short hType,IntPtr handle);
  10. [DllImport("odbc32.dll",CharSet = CharSet.Ansi)]
  11. private static extern short sqlBrowseConnect(IntPtr hconn,StringBuilder inString,short inStringLength,StringBuilder outString,short outStringLength,out short outLengthNeeded);
  12. #endregion
  13.  
  14. #region Constants
  15. private const short sql_HANDLE_ENV = 1;
  16. private const short sql_HANDLE_DBC = 2;
  17. private const int sql_ATTR_ODBC_VERSION = 200;
  18. private const int sql_OV_ODBC3 = 3;
  19. private const short sql_SUCCESS = 0;
  20. private const short sql_NEED_DATA = 99;
  21. private const short DEFAULT_RESULT_SIZE = 1024;
  22. private const string sql_DRIVER_STR = "DRIVER=sql SERVER";
  23. #endregion
  24.  
  25. #region static string[] GetServers()
  26. public static string[] GetNames()
  27. {
  28. string[] retval = null;
  29. string txt = string.Empty;
  30. IntPtr henv = IntPtr.Zero;
  31. IntPtr hconn = IntPtr.Zero;
  32. StringBuilder inString = new StringBuilder(sql_DRIVER_STR);
  33. StringBuilder outString = new StringBuilder(DEFAULT_RESULT_SIZE);
  34. short inStringLength = (short)inString.Length;
  35. short lenNeeded = 0;
  36.  
  37. try
  38. {
  39. if (sql_SUCCESS == sqlAllocHandle(sql_HANDLE_ENV,henv,out henv))
  40. {
  41. if (sql_SUCCESS == sqlSetEnvAttr(henv,sql_ATTR_ODBC_VERSION,(IntPtr)sql_OV_ODBC3,0))
  42. {
  43. if (sql_SUCCESS == sqlAllocHandle(sql_HANDLE_DBC,out hconn))
  44. {
  45. if (sql_NEED_DATA == sqlBrowseConnect(hconn,inString,inStringLength,outString,DEFAULT_RESULT_SIZE,out lenNeeded))
  46. {
  47. if (DEFAULT_RESULT_SIZE < lenNeeded)
  48. {
  49. outString.Capacity = lenNeeded;
  50. if (sql_NEED_DATA != sqlBrowseConnect(hconn,lenNeeded,out lenNeeded))
  51. {
  52. throw new ApplicationException("Unabled to aquire sql Servers from ODBC driver.");
  53. }
  54. }
  55. txt = outString.ToString();
  56. int start = txt.IndexOf("{") + 1;
  57. int len = txt.IndexOf("}") - start;
  58. if ((start > 0) && (len > 0))
  59. {
  60. txt = txt.Substring(start,len);
  61. }
  62. else
  63. {
  64. txt = string.Empty;
  65. }
  66. }
  67. }
  68. }
  69. }
  70. }
  71. catch (Exception ex)
  72. {
  73. //Throw away any error if we are not in debug mode
  74. //#if (DEBUG)
  75. //MessageBox.Show(ex.Message,"Acquire sql Servier List Error");
  76. //#endif
  77. txt = string.Empty;
  78.  
  79. throw ex;
  80. }
  81. finally
  82. {
  83. if (hconn != IntPtr.Zero)
  84. {
  85. sqlFreeHandle(sql_HANDLE_DBC,hconn);
  86. }
  87. if (henv != IntPtr.Zero)
  88. {
  89. sqlFreeHandle(sql_HANDLE_ENV,hconn);
  90. }
  91. }
  92.  
  93. if (txt.Length > 0)
  94. {
  95. retval = txt.Split(",".tocharArray());
  96. }
  97.  
  98. return retval;
  99. }
  100. #endregion
  101. }

代码仅适用于sqlServers和WindowsXP.

它不适用于其他DBMS服务器和Win7.

我需要一个规范的解决方案.

解决方法

您也可以使用 SqlDataSourceEnumerator类.请记住,这是MS sql Server特定的……
  1. var results = sqlDataSourceEnumerator.Instance.GetDataSources();
  2.  
  3. foreach (var row in results.Rows)
  4. {
  5. Console.WriteLine("{0}\{1}",row["ServerName"],row["InstanceName"]);
  6. }

有关其他信息,请参阅此link

猜你在找的C#相关文章