Для додавання джерела даних треба викликати програму установки ODBC в Control Panel і, вибравши необхідний тип джерела даних, вибрати драйвер і додати його кнопкою Add. В з'явившомуся діалоговому вікні "Create New Data Source" можна вибрати базу даних і встановити необхідні властивості драйвера. Основне діалогове вікно містить список всіх інстальованних джерел даних:
джерело даних джерело системних джерело файлових
користувача даних даних
Діалогове вікно "ODBC Data Source Administrator"
Приклад програми ODBC.
Нище наведено текст простого застосування ODBC, яке зчитує рядки, що містяться в таблиці Excel. Коли доступ до таблиці Excel здійснюється з використанням драйвера Microsoft Excel ODBC, електронні таблиці відіграють роль таблиць бази даних, а рядки в таблиці – роль записів у ній.
Т
аблиця Excel складається з 4 стовпчиків, що містять інформацію про прізвище та ім'я студента, факультет, де він навчається, та рейтинг за осінній триместр 1998/1999 навч. рік.
Замість інсталяції цієї таблиці в якості джерела даних, використовуючи програму початкової установки ODBC, можна скористуватися можливостями функції SQLDriverConnect.
Застосування може бути скомпільовано з командного рядка введеннням:
cl student.c odbc32.lib. Файл student.xls (таблиця Excel) повинен бути доступним з поточного каталогу.
#include
#include
#include
#include
#define CONNSTR "DBQ=Student.XLS;DRIVER={Microsoft Excel Driver (*.xls)}"
#define CONNLEN (sizeof(CONNSTR)-1)
#define SQLTRY(x,y)
{
rc = y;
if (rc != SQL_SUCCESS)
{
char szState[6];
char szMsg[255];
SDWORD sdwNative;
SWORD swMsgLen;
SQLError(hEnv, hDBC, hStmt, szState, &sdwNative, szMsg, sizeof(szMsg), &swMsgLen);
printf("Error %d performing %snSQLState = %snSQL message = %sn", rc, x, szState, szMsg);
goto Terminate;
}
}
void main(void)
{
SQLHENV hEnv = 0;
SQLHDBC hDBC = 0;
SQLHSTMT hStmt = 0;
SQLCHAR szConnStr[255];
SQLCHAR szStmt[255];
SQLCHAR szName[255];
SQLCHAR szFaculty[255];
long nRating;
SWORD cbConnStr;
RETCODE rc;
SDWORD sdwNLen;
SDWORD sdwFLen;
SDWORD sdwRLen;
int i;
char szResult[1000];
SQLTRY("SQLAllocEnv", SQLAllocEnv(&hEnv))
SQLTRY("SQLAllocConnect", SQLAllocConnect(hEnv, &hDBC))
SQLTRY("SQLDriverConnect", SQLDriverConnect(hDBC, NULL, CONNSTR, CONNLEN, szConnStr, sizeof(szConnStr), &cbConnStr, SQL_DRIVER_NOPROMPT))
SQLTRY("SQLAllocStmt", SQLAllocStmt(hDBC, &hStmt))
sprintf(szStmt, "SELECT * FROM [Sheet1$]");
SQLTRY("SQLPrepare", SQLPrepare(hStmt, szStmt, strlen(szStmt)))
SQLTRY("SQLBindCol", SQLBindCol(hStmt, 1, SQL_C_CHAR, (PTR)szName, sizeof(szName), &sdwNLen))
SQLTRY("SQLBindCol", SQLBindCol(hStmt, 2, SQL_C_CHAR, (PTR)szFaculty, sizeof(szFaculty), &sdwFLen))
SQLTRY("SQLBindCol", SQLBindCol(hStmt, 3, SQL_C_SLONG, (PTR)&nRating, sizeof(nRating), &sdwRLen))
SQLTRY("SQLExecute", SQLExecute(hStmt))
for (i = 1; (rc = SQLFetch(hStmt)) == SQL_SUCCESS; i++)
{
printf("Record #%dtName: %stFaculty: %stRating: %dn", i, szName, szFaculty, nRating);
}
if (rc != SQL_NO_DATA_FOUND)
{
SQLTRY("SQLFetch", rc)
}
printf("Successfully completed.n");
Terminate0:
if (hStmt) SQLFreeStmt(hStmt, SQL_CLOSE);
if (hDBC) SQLDisconnect(hDBC);
if (hDBC) SQLFreeConnect(hDBC);
if (hEnv) SQLFreeEnv(hEnv);
SQLTRY("SQLAllocEnv", SQLAllocEnv(&hEnv))
SQLTRY("SQLAllocConnect", SQLAllocConnect(hEnv, &hDBC))
SQLTRY("SQLDriverConnect", SQLDriverConnect(hDBC, NULL, CONNSTR, CONNLEN, szConnStr, sizeof(szConnStr), &cbConnStr, SQL_DRIVER_NOPROMPT))
SQLTRY("SQLAllocStmt", SQLAllocStmt(hDBC, &hStmt))
sprintf(szStmt, "SELECT * FROM [Sheet1$] WHERE Rating>91 ORDER BY Rating DESC");
SQLTRY("SQLPrepare", SQLPrepare(hStmt, szStmt, strlen(szStmt)))
SQLTRY("SQLBindCol", SQLBindCol(hStmt, 1, SQL_C_CHAR, (PTR)szName, sizeof(szName), &sdwNLen))
SQLTRY("SQLBindCol", SQLBindCol(hStmt, 2, SQL_C_CHAR, (PTR)szFaculty, sizeof(szFaculty), &sdwFLen))
SQLTRY("SQLBindCol", SQLBindCol(hStmt, 3, SQL_C_SLONG, (PTR)&nRating, sizeof(nRating), &sdwRLen))
SQLTRY("SQLExecute", SQLExecute(hStmt))
for (i = 1; (rc = SQLFetch(hStmt)) == SQL_SUCCESS; i++)
{
printf("Record #%dtName: %stFaculty: %stRating: %dn", i, szName, szFaculty, nRating);
}
if (rc != SQL_NO_DATA_FOUND)
{
SQLTRY("SQLFetch", rc)
}
printf("Successfully completed.n");
Terminate:
if (hStmt) SQLFreeStmt(hStmt, SQL_CLOSE);
if (hDBC) SQLDisconnect(hDBC);
if (hDBC) SQLFreeConnect(hDBC);
if (hEnv) SQLFreeEnv(hEnv);
}
Простий макрос SQLTRY використовується для повідомлення про помилки.
Після обов'язкових звертань до функцій SQLAllocEnv та SQLAllocConnect програма викликає SQLDriveConnect. Цей виклик робить можливим відкриття таблиці, яка не встановлювалась з використанням програми початкової установки ODBC і робить це без відображення інтерфейса користувача. Для відкриття таблиці використовуються константи CONNSTR та CONNLEN. Як тільки підключення до бази даних успішно завершено, виконуються послідовно два оператори SQL:
SELECT * FROM [Sheet$] - Вибрати всі записи з таблиці Student.
SELECT * FROM[Sheet$] WHERE Rating>91 ORDER BY Rating DESC – Вибрати записи з таблиці Student про тих студентів, що мають рейтинг більший за 91, та впорядкувати виведений список за зменшенням рейтингів студентів.
Ім'я Sheet$ - це ім'я, яке надається драйвером для першої таблиці в робочій книзі Excel. Оператор SQL використовується для отримання полів всіх записів.
Наступні 4 звертання прив'язують змінні до стовпчиків таблиці. Таке призначення функції SQLBindCol. Після послідовного отримання записів, значення полів переміщуються в ці змінні.
Самі записи отримуються за допомогою функції SQLFetch і відображаються з використанням printf. Функція SQLFetch викликається до тих пір, поки значення, що повертається нею, не відрізняється чим-небудь від SQL_SUCCESS. Значення, що повертається, SQL_NO_DATA_FOUND показує, що отриманий останній запис, все інше є помилкою і обробляється відповідним чином.
Програма завершується обов'язковими звертаннями до функцій SQLFreeStmt, SQLDisconnect, SQLFreeConnect та SQLFreeEnv для звільнення ресурсів і закінчення зв'язку з джерелом даних.
При запуску цієї програми забезпечується такий вивід:
Стандарт SQL та