|
Найти все SQL сервера
#33434093
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
|
Участник
Откуда: glubinka
Сообщения: 4 167
|
|
список MSSQL серверов на managed C++
данный код посылает в сеть датаграммму через UDP и получается ответы от MSSQL серверов.
до чего уродский этот манажд С++ тогда и особенно не пойму нафига тогда C# придумали.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203.
#include "stdafx.h"
using namespace System;
using namespace System::Collections;
using namespace System::Collections::Specialized;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::Threading;
using namespace System::Data;
using namespace System::Data::OleDb;
using namespace System::Text;
namespace Util
{
public ref class SqlServerInfo
{
private :
String^ m_ServerName;
String^ m_InstanceName;
bool m_IsClustered;
String^ m_Version;
int m_tcpPort;
String^ m_Np;
String^ m_Rpc;
IPAddress^ m_IP;
StringCollection m_Catalogs;
String^ m_UserId;
String^ m_Password;
bool m_IntegratedSecurity;
int m_TimeOut;
public :
String^ srv_name(){ return m_ServerName; }
SqlServerInfo(){}
bool Parser( IPAddress^ ip, array<Byte>^ bytes )
{
try
{
int num = BitConverter::ToInt16( bytes, 1 );
ASCIIEncoding^ ascii = gcnew ASCIIEncoding();
String^ info = ascii->GetString( bytes, 3 , num );
return Parser( ip, info );
}catch(...){}
return false;
}
bool Parser( IPAddress^ ip, String^ info )
{
m_IP = ip;
array<String^>^ nvs = info->Split(';', 1 );
for (int i = 0 ; i < nvs->Length; i += 2 )
{
String ^item1 = nvs[i+ 1 ];
String ^item = nvs[i]->ToLower();
if( item == "servername" )
{
this->m_ServerName = item1;
}else if( item == "instancename" )
{
this->m_InstanceName = item1;
}else if( item == "isclustered" )
{
this->m_IsClustered = (item1->ToLower() == "yes");
}else if( item == "version" )
{
this->m_Version = item1;
}else if( item == "tcp" )
{
this->m_tcpPort = int::Parse(item1);
}else if( item == "np" )
{
this->m_Np = item1;
}else if( item == "rpc" )
{
this->m_Rpc = item1;
}
}
return ( nvs->Length > 0 );
}
OleDbConnection^ GetConnection()
{
String^ myConnString = m_IntegratedSecurity ?
String::Format("Provider=SQLOLEDB;Data Source={0};Integrated Security=SSPI;Connect Timeout={1}", this, m_TimeOut)
: String::Format("Provider=SQLOLEDB;Data Source={0};User Id={1};Password={2};Connect Timeout={3}",
this, m_UserId, m_Password, m_TimeOut);
return gcnew OleDbConnection( myConnString );
}
bool TestConnection()
{
OleDbConnection^ conn = this->GetConnection();
bool success = false;
try
{
conn->Open();
conn->Close();
success = true;
}
catch(...){}
return success;
}
virtual String^ ToString() override
{
if( String::IsNullOrEmpty(m_InstanceName) || m_InstanceName == "MSSQLSERVER")
return m_ServerName;
else
return m_ServerName + "\\" + m_InstanceName;
}
StringCollection^ GetCatalogs()
{
StringCollection^ catalogs = gcnew StringCollection();
try
{
OleDbConnection^ myConnection = this->GetConnection();
myConnection->Open();
array<Object^>^ restrictions;
DataTable^ schemaTable = myConnection->GetOleDbSchemaTable( OleDbSchemaGuid::Catalogs, restrictions );
myConnection->Close();
for( int i = 0 ; i < schemaTable->Rows->Count; i++ )
{
DataRow^ dr = schemaTable->Rows[i];
String^ dir = dr[i]->ToString();
catalogs->Add( dir );
}
}
catch(Exception^ ex)
{
System::Windows::Forms::MessageBox::Show(ex->Message);
}
return catalogs;
}
static array<SqlServerInfo^>^ Seek()
{
Socket^ socket = gcnew Socket(AddressFamily::InterNetwork, SocketType::Dgram, ProtocolType::Udp);
// For .Net v 1 . 1
// socket->SetSocketOption(SocketOptionLevel::Socket, SocketOptionName::Broadcast, 1 );
// socket->SetSocketOption(SocketOptionLevel::Socket, SocketOptionName::ReceiveTimeout, 3000 );
// For .Net v 2 . 0 it's a bit simpler
socket->EnableBroadcast = true; // for .Net v2.0
socket->ReceiveTimeout = 3000; // for .Net v2.0
ArrayList^ servers = gcnew ArrayList();
try
{
array<Byte>^ msg= {0x02};
IPEndPoint^ ep = gcnew IPEndPoint(IPAddress::Broadcast, 1434);
socket->SendTo( msg, SocketFlags::None, ep );
int cnt = 0;
array<Byte>^ bytBuffer = gcnew array<Byte>(1024);
ArrayList^ lst = gcnew ArrayList();
do
{
cnt = socket->Receive(bytBuffer);
IPAddress^ ip;
SqlServerInfo^ srv = gcnew SqlServerInfo;
if( srv->Parser( ip, bytBuffer ) )
{
String^ srv_name = srv->m_ServerName;
String^ inst_name = srv->m_InstanceName;
if( !String::IsNullOrEmpty( inst_name ) )
{
srv_name = srv_name + "\\" + inst_name;
}
if( lst->IndexOf( srv_name ) < 0 )
{
servers->Add( srv );
lst->Add( srv_name );
}
}
socket->SetSocketOption(SocketOptionLevel::Socket, SocketOptionName::ReceiveTimeout, 300);
}while( cnt != 0 );
}
catch (SocketException^ socex)
{
const int WSAETIMEDOUT = 10060; // Connection timed out.
const int WSAEHOSTUNREACH = 10065; // No route to host.
// Re-throw if it's not a timeout.
if (socex->ErrorCode == WSAETIMEDOUT || socex->ErrorCode == WSAEHOSTUNREACH)
{
// DO nothing......
}
else
{
//Console->WriteLine("{0} {1}", socex->ErrorCode, socex->Message);
throw;
}
}
finally
{
socket->Close();
}
array<SqlServerInfo^>^ aServers = gcnew array<SqlServerInfo^>( servers->Count );
servers->CopyTo(aServers);
return aServers;
}
};
}
пример использования загрузки в combobox:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
void DBConnect::loadServerList()
{
cboxServer->Items->Clear();
array<SqlServerInfo^>^ lst = Util::SqlServerInfo::Seek();
for(int i = 0 ; i < lst->Length; i++)
{
SqlServerInfo^ name_srv = lst[i];
String^ srv_name = srv->m_ServerName;
String^ inst_name = srv->m_InstanceName;
if( !String::IsNullOrEmpty( inst_name ) )
{
srv_name = srv_name + "\\" + inst_name;
}
cboxServer->Items->Add( srv_name );
}
}
|
|
|