Skip navigation

Csatlakozás ODBC-vel

Adatbáziskapcsolat létrehozása

Az adatbázis kapcsolat előkészítéséhez be kell állítani a környezeteket, majd az SQLDriverConnect() függvénnyel létrehozzuk az adatbázis kapcsolatot. 

SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;  
 
/* beallitjuk a kornyezeti valtozokat, az alapveto mukodeshez szukseges*/
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
 
/* megnyitjuk a kapcsolatot az SQLDriverConnect utasitassal*/
ret = SQLDriverConnect(dbc, NULL, (unsigned char *)"DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=pelda;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);

Lekérdezés előkészítése és futtatása

A lekérdezést egy SQLPrepare() függvénnyel készítjük elő, majd az SQLExecute() függvénnyel futtatjuk le.

SQLCHAR *text = (SQLCHAR *)"SELECT szam,szoveg from pelda";
SQLPrepare(stmt, text, SQL_NTS);
SQLRETURN ret = SQLExecute(stmt);

A lekérdezés eredményeinek listázása

Az eredmények listázása előtt az SQLBindCol() függvénnyel meg kell mondani, hogy a lekérdezett sorok mezőit, mely változókban tárolja el a rendszer. Az eredmények listázása a SQLFetch() függvénnyel történik.  Minden egyes lekérdezett sor esetén a mezőkhöz hozzárendelt változók értéke felülíródik.

pelda.cpp

#include <stdio.h>
//windows kornyezetben include-olni kell a windows.h-t
//#include <windows.h>
//az sql.h es az sqlext.h szuksegesek az sql mukodtetesehez
#include <sql.h>
#include <sqlext.h>
 
 
/* a lenti ket struktura szukseges az adattablaban levo oszlopokra valo hivatkozashoz */
/* az SQL kezdetu tipusok kinezhetoek az sqlext.h header=bol */
struct
  {
    SQLINTEGER ind;
    SQLVARCHAR val[20];
  }
  szoveg;
 
struct
  {
    SQLINTEGER ind;
    SQLINTEGER val;
  }
  szam;
 
int main() {
  /* letrehozzuk a szukseges valtozokat */
  SQLHENV env;
  SQLHDBC dbc;
  SQLHSTMT stmt;
  SQLRETURN ret;  
 
  /* beallitjuk a kornyezeti valtozokat, az alapveto mukodeshez szukseges*/
  SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
  SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
  SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
   
  /* megnyitjuk a kapcsolatot az SQLDriverConnect utasitassal*/
  ret = SQLDriverConnect(dbc, NULL, (unsigned char *)"DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=pelda;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
 
  /* ellenorizzuk, hogy a kapcsolatteremtes sikeres volt-e */
  if (SQL_SUCCEEDED(ret)) {
    printf("Connected\n");
  } else {
    printf("Failed to connect\n");
    exit(-1);
  }
 
  SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
 
  /* letrehozzuk az utasitast tartalmazo stringet*/
  SQLCHAR *text = (SQLCHAR *)"SELECT szam,szoveg from varosok";
 
  /* elokeszitjuk, majd vegrehajtjuk az utasitast*/
  SQLPrepare(stmt, text, SQL_NTS);
  ret = SQLExecute(stmt);
 
  /* hozzarendeljuk a megfelelo strukturakat az eredmenytabla egyes oszlopaihoz */
  /* ezt a lepest automatizalhatjuk is, ha lekerdezzuk az eredmenytabla szerkezetet */
  ret = SQLBindCol(stmt, 1, SQL_C_SHORT , &szam.val, 0, &szam.ind);
  ret = SQLBindCol(stmt, 2, SQL_C_CHAR , &szoveg.val, 20, &szoveg.ind);
 
  /* lekerjuk az eredmeny elso sorat */
  ret = SQLFetch(stmt);
 
  /* ellenorizzuk, hogy van-e meg adat es ha van kiirjuk a kepernyore */
  if (ret == SQL_NO_DATA_FOUND)
  {
    printf("\n  Data not found.\n");
  }
  while (ret != SQL_NO_DATA_FOUND)
  {
    printf("%d | %s\n", szam.val,szoveg.val);
    /* lekerjuk a kovetkezo sort */
    ret = SQLFetch(stmt);
  }  
 
  return 0;
}

Licensed under the Creative Commons Attribution Non-commercial Share Alike License 4.0