2011-03-17 10 views
6

Jestem na komputerze W32 próbującym uzyskać połączenie z bazą danych. W tym celu Próbowałem rozpoczęciem testowania przykładowy program:Używanie ODBC do łączenia się z SQL SERVER 2008

#include <iostream> 
#include <windows.h> 
#include <sqltypes.h> 
#include <sql.h> 
#include <sqlext.h> 

using namespace std; 

void show_error(unsigned int handletype, const SQLHANDLE& handle){ 
    SQLCHAR sqlstate[1024]; 
    SQLCHAR message[1024]; 
    if(SQL_SUCCESS == SQLGetDiagRec(handletype, handle, 1, sqlstate, NULL, message, 1024, NULL)) 
     cout<<"Message: "<<message<<"\nSQLSTATE: "<<sqlstate<<endl; 
} 

int main(){ 

    SQLHANDLE sqlenvhandle; 
    SQLHANDLE sqlconnectionhandle; 
    SQLHANDLE sqlstatementhandle; 
    SQLRETURN retcode; 

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlenvhandle)) 
     goto FINISHED; 

    if(SQL_SUCCESS!=SQLSetEnvAttr(sqlenvhandle,SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0)) 
     goto FINISHED; 

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_DBC, sqlenvhandle, &sqlconnectionhandle)) 
     goto FINISHED; 

    SQLCHAR retconstring[1024]; 
    switch(SQLDriverConnect (sqlconnectionhandle, 
       NULL, 
       (SQLCHAR*)"DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=MyDatabase;UID=sa;PWD=Admin-123;", 
       SQL_NTS, 
       retconstring, 
       1024, 
       NULL, 
       SQL_DRIVER_NOPROMPT)){ 
     case SQL_SUCCESS_WITH_INFO: 
      show_error(SQL_HANDLE_DBC, sqlconnectionhandle); 
      break; 
     case SQL_INVALID_HANDLE: 
     case SQL_ERROR: 
      show_error(SQL_HANDLE_DBC, sqlconnectionhandle); 
      goto FINISHED; 
     default: 
      break; 
    } 

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_STMT, sqlconnectionhandle, &sqlstatementhandle)) 
     goto FINISHED; 

    if(SQL_SUCCESS!=SQLExecDirect(sqlstatementhandle, (SQLCHAR*)"select * from testtable", SQL_NTS)){ 
     show_error(SQL_HANDLE_STMT, sqlstatementhandle); 
     goto FINISHED; 
    } 
    else{ 
     char name[64]; 
     char address[64]; 
     int id; 
     while(SQLFetch(sqlstatementhandle)==SQL_SUCCESS){ 
      SQLGetData(sqlstatementhandle, 1, SQL_C_ULONG, &id, 0, NULL); 
      SQLGetData(sqlstatementhandle, 2, SQL_C_CHAR, name, 64, NULL); 
      SQLGetData(sqlstatementhandle, 3, SQL_C_CHAR, address, 64, NULL); 
      cout<<id<<" "<<name<<" "<<address<<endl; 
     } 
    } 

FINISHED: 
    SQLFreeHandle(SQL_HANDLE_STMT, sqlstatementhandle); 
    SQLDisconnect(sqlconnectionhandle); 
    SQLFreeHandle(SQL_HANDLE_DBC, sqlconnectionhandle); 
    SQLFreeHandle(SQL_HANDLE_ENV, sqlenvhandle); 

} 

Problemem jest to, że mam wiele problemów przy próbie kompilacji, odnośnie niezadeklarowanych typów, na przykład:

'SQLHANDLE' has not been declared 
'SQLHDESC' was not declared in this scope 

Mam powiązane do bibliotek libodbccpp32.a i libodbc32.a. Co robię źle?

+0

Błąd wskazuje, że nie uwzględniono nagłówków odbc opisujących sqlhandle/sqlhdesc. Myślę, że jest w ntodbc.h. – Dan

+0

Czy masz pojęcie, skąd mogę pobrać ten nagłówek? – Filgera

+0

Wygląda na taki, który był specyficzny dla zestawu SDK Sybase, którego używałem. Oto lista tych Microsoft. http://msdn.microsoft.com/en-us/library/ms713603%28v=VS.85%29.aspx. Właściwie to jest to sqltypes.h, to jest SDK Microsoftu. Tutaj zainstalowałem C: \ Program Files \ Microsoft Visual Studio .NET 2003 \ Vc7 \ PlatformSDK \ Include. Czy są jakieś dodatkowe szczegóły w błędach kompilacji od momentu włączenia? Jak wygląda twoja ścieżka? – Dan

Odpowiedz

1

z stdafx.h nagłówku, że postanowienie to powinno być zamiast znalazłem:

#include <iostream> 
#include <windows.h> 
#include <sqlext.h> 
#include <sqltypes.h> 
#include <sql.h> 
-1

wystarczy zmienić zawierać deklaracje tak: pliki nagłówkowe

#include <iostream> 
#include <windows.h> 
#include <sql.h> 
#include <sqltypes.h> 
#include <sqlext.h> 
1

zamawiania nie ma znaczenia. Wystarczy upewnić się, że projekt zawiera w swoim właściwościom następujące obejmują katalog:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include 

gdzie się znajdują (a priori):

windows.h 
sqlext.h 
sqltypes.h 
sql.h 

To wystarczy w podejmowaniu Polecenia rozpoznawane i skompilować bez problemu .