Сообщений 0 Оценка 54 Оценить |
Список драйверов ODBC, установленных в системе, можно получить минимум двумя способами, один их которых основан на ODBC API, унаследованном от Win16, а второй - на более современном API. Второй способ позволяет в дополнение к списку драйверов получить наборы аттрибутов, поддерживаемых каждым из драйверов.
#include <windows.h> #include <stdio.h> #include <odbcinst.h> // SQLGetInstalledDrivers() #include <sqlext.h> // SQLDrivers() #pragma comment(lib, "odbc32") #pragma comment(lib, "odbccp32") #pragma comment(lib, "user32") void main() { #define MAX_BUF 1024 char drivers[MAX_BUF] = {0}; char descrip[MAX_BUF] = {0}; WORD rdriv = 0, rdesc = 0; //----------- Способ 1 ----------------------------------- BOOL res = SQLGetInstalledDrivers(drivers, MAX_BUF, &rdriv); if(rdriv == MAX_BUF) printf("Too few buffer size.\n"); char* p = drivers; while(*p) { printf("%s\n", p); p += lstrlen(p) + 1; } printf("\n"); //----------- Способ 2 ------------------------------------ SQLHENV hEnv; SQLRETURN ret; ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, &hEnv); ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); SQLSMALLINT direction = SQL_FETCH_FIRST; while(1) { ret = SQLDrivers( hEnv, direction, (SQLTCHAR*)drivers, MAX_BUF, (short*)&rdriv, (SQLTCHAR*)descrip, MAX_BUF, (short*)&rdesc); if(SQL_NO_DATA == ret) break; direction = SQL_FETCH_NEXT; printf("* %s\n", drivers); p = descrip; while(*p) { CharToOem(p, p); printf("%s; ", p); p += lstrlen(p) + 1; } printf("\n"); } SQLFreeHandle(SQL_HANDLE_ENV, hEnv); printf("\n"); } |
Список источников данных получается аналогично получению списка драйверов по второму способу.
#include <windows.h> #include <stdio.h> #include <sqlext.h> #pragma comment(lib, "odbc32") #pragma comment(lib, "odbccp32") #pragma comment(lib, "user32") void main() { #define MAX_BUF 1024 char datasrc[MAX_BUF] = {0}; char descrip[MAX_BUF] = {0}; short rdsrc = 0, rdesc = 0; SQLHENV hEnv; SQLRETURN ret; ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, &hEnv); ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); SQLSMALLINT direction = SQL_FETCH_FIRST; while(1) { ret = SQLDataSources( hEnv, direction, (SQLTCHAR*)datasrc, MAX_BUF, &rdsrc, (SQLTCHAR*)descrip, MAX_BUF, &rdesc); if(SQL_NO_DATA == ret) break; direction = SQL_FETCH_NEXT; CharToOem(datasrc, datasrc); CharToOem(descrip, descrip); printf("* %s (%s)\n", datasrc, descrip); } SQLFreeHandle(SQL_HANDLE_ENV, hEnv); printf("\n"); } |
ПРИМЕЧАНИЕ Вы при необходимости можете сузить диапазон выводимых значений, указав для direction в качестве стартового параметра SQL_FETCH_FIRST_USER для пользовательских источников данных и SQL_FETCH_FIRST_SYSTEM для системных. |
Сообщений 0 Оценка 54 Оценить |