ODBC (Oracle), pobranie danych

0

Hej! Próbuje pobrać dane z bazy poprzez ODBC (czysty C/C++ i WINAPI), niestety jest problem z pobieraniem danych. Połączenie jest ok, nawet pobrałem nazwy kolumn, typ kolumn ale jest problem z odczytem zbioru danych...


#define NAME_LEN 50
#define PHONE_LEN 20


   SQLHENV henv;
   SQLHDBC hdbc;
   SQLHSTMT hstmt = 0;
   SQLRETURN retcode;
   SQLWCHAR szName[NAME_LEN], szPhone[PHONE_LEN], sCustID[NAME_LEN];
   SQLLEN cbName = 0, cbCustID = 0, cbPhone = 0;
   printf("INICJALIZACJA ODBC\n");

   retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
      retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); 
	     printf("USTAWIONO SRODOWISKO ODBC\n");
      // Allocate connection handle
      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
         retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);


         if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
            SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
			printf("USTANOWIONO UCHWYT ODBC\n");

            retcode = SQLConnect(hdbc, (SQLCHAR*) "nazwapolaczenia", SQL_NTS, (SQLCHAR*) "test", SQL_NTS, (SQLCHAR*) "test", SQL_NTS);


            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { 
				printf("POLACZONO!\n");
               retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
			   printf("SELECT CustomerID, ContactName, Phone FROM TABELATEST ORDER\n");
               retcode = SQLExecDirect(hstmt, (SQLCHAR *) "SELECT CustomerID, ContactName, Phone FROM TABELATEST", SQL_NTS);
               if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
					printf("BIND\n");
                  // Tutaj zaczynają się schody
                  retcode = SQLBindCol(hstmt, 1, SQL_C_SLONG, &sCustID, sizeof(sCustID), &cbCustID);
					 if (retcode == NULL)
					 {
						 printf("NULL 1\n"); // tutaj null
					 }
                  retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, szName, NAME_LEN, &cbName);
				 if (retcode == NULL)
					 {
						 printf("NULL 2\n");// tutaj null
					 }
                  retcode = SQLBindCol(hstmt, 3, SQL_C_CHAR, szPhone, PHONE_LEN, &cbPhone); 
				 if (retcode == NULL)
					 {
						 printf("NULL 3\n");// tutaj null
          
                  for (int i=0 ; i<=2; i++) { // tutaj sobie później policzę liczbę wierszy
					              printf("obrot %d\n", i);
                     retcode = SQLFetch(hstmt);
                     if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO)
                        printf("BŁĄD!\n");
					 if (retcode == NULL)
					 {
						 printf("NULL\n");
					 }
                     if (retcode != NULL)//== SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
					 {
						printf("wiersz %d\n", i);
                        wprintf(L"%d: %S %S %S\n", i + 1, sCustID, szName, szPhone);
					 }
                     else
                        break;
                  }
               }
			   else
			   {
				   printf("Jakiś błąd!\n");
			   }


               if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                  SQLCancel(hstmt);
                  SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
               }

               SQLDisconnect(hdbc);
            }
			else
			   {
				   printf("BLAD POLACZENIA! \n");
			   }

            SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
         }
      }
      SQLFreeHandle(SQL_HANDLE_ENV, henv);
   }

 

Czemu nie binduje kolumn?
:(

1

wszędzie w przykładach najpierw jest bind kolumn a dopiero potem wykonanie zapytania
https://msdn.microsoft.com/en-us/library/ms710118(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/ms713541(v=vs.85).aspx

0

Ooo dzięki! Fakt... niedopatrzenie. W tutorialu był chyba błąd. Poprawiłem, ale nadal są NULLe przy bindowaniu i wykonaniu zapytania. Znalazłem gdzie indziej tutorial, zaraz go ogarnę :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1