Abfrage aller Instanzen von SQl-Servern in einem LAN
-
In meiner Anwenung möchte ich alle im LAN befindlichen SQL-Server (Vorrangig MS SQL Express 2005) in einer Listbox aufführen. Leider weiß ich grad nicht wie ich das anstellen soll. Ich hatte mit folgendem Code versucht:
SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; SQLRETURN retcode; SQLCHAR OutConnStr[255]; SQLSMALLINT OutConnStrLen; HWND desktopHandle = GetDesktopWindow(); // desktop's window handle // Allocate environment handle retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); // Set the ODBC version environment attribute if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); // Allocate connection handle if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); // Set login timeout to 5 seconds if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0); retcode = SQLDriverConnect( // SQL_NULL_HDBC hdbc, desktopHandle, //(SQLCHAR*)"driver=SQL Server", (SQLCHAR*)"DRIVER=SQL Server", _countof("DRIVER=SQL Server"), OutConnStr, 255, &OutConnStrLen, SQL_DRIVER_PROMPT ); // Allocate statement handle if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); // Process data if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { SQLFreeHandle(SQL_HANDLE_STMT, hstmt); } SQLDisconnect(hdbc); } SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } } SQLFreeHandle(SQL_HANDLE_ENV, henv); }
Allerdings wird hier versucht, eine Verbindung aufzubauen. Weiterhin komme ich hier auch nicht so einfach an den Connectionstring ran.
Dann hatte ich das hier mir angesehen:
http://www.codeproject.com/KB/database/SubmitSQLInfoEnumerator.aspx
Allerdings bin ich an C++ bzw. die MFC gebunden und kann kein C# verwenden.
Hat jemand einen Tipp wie ich das umsetzen kann? Der Hintergrund: in der Anwendung soll ein Benutzer mit administrativen Rechten die Datenbankinstanz wählen können, ohne den BS-eigenen ODBC-Administrator zu benutzen. Deshalb soll er aus einer Liste aller im LAN gefundenen Instanzen eine wählen können.
-
eventuell hilft dieser Beitrag: http://www.codeproject.com/KB/database/EnumSQLServer.aspx
-
Linnea schrieb:
eventuell hilft dieser Beitrag: http://www.codeproject.com/KB/database/EnumSQLServer.aspx
Zunächst vielen Dank für die schnelle Antwort. Diese Art und Weise bedingt, dass ja schon SQL-Serverkomponenten bzw. MDAC auf der Maschine installiert sein müssen. Ich hab den Artikel mal weiter durchforstet und bin auf folgendes gekommen:
http://www.codeproject.com/KB/database/sqlsrvenumerator.aspx
Dort werden zumindest alle Instanzen korrekt angezeigt. Allerdings kann ich nicht auf die einzelnen Databases einer Instanz zugreifen, da er die nicht findet. Muss da noch was sprezielles beachtet werden?
-
AndyDD schrieb:
Zunächst vielen Dank für die schnelle Antwort. Diese Art und Weise bedingt, dass ja schon SQL-Serverkomponenten bzw. MDAC auf der Maschine installiert sein müssen. Ich hab den Artikel mal weiter durchforstet und bin auf folgendes gekommen:
http://www.codeproject.com/KB/database/sqlsrvenumerator.aspx
Dort werden zumindest alle Instanzen korrekt angezeigt. Allerdings kann ich nicht auf die einzelnen Databases einer Instanz zugreifen, da er die nicht findet. Muss da noch was sprezielles beachtet werden?
Ok, wenn man an der entsprechenden Stelle _T("DATABASE:Database=") gegen _T("DATABASE:Datenbank=") austauscht, dann gehts.