2011-03-17 6 views
6

Sono su una macchina W32 che tenta di ottenere una connessione con un DB. A tal fine, ho cercato di iniziare il test di un programma di esempio:Utilizzo di ODBC per la connessione a 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); 

} 

Il problema è che ho problemi di molti quando si tenta di compilare, per quanto riguarda i tipi non dichiarati, ad esempio:

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

ho collegato alle librerie libodbccpp32.a e libodbc32.a. Che cosa sto facendo di sbagliato?

+0

L'errore sembra indicare che non sono state incluse le intestazioni odbc che descrivono sqlhandle/sqlhdesc. Penso che sia in ntodbc.h. – Dan

+0

Hai idea di dove posso ottenere quell'intestazione? – Filgera

+0

Sembra che fosse specifico per l'SDK Sybase che stavo usando. Ecco una lista di quelli di Microsoft. http://msdn.microsoft.com/en-us/library/ms713603%28v=VS.85%29.aspx. In realtà è sqltypes.h che è l'unico sdk di Microsoft. Ecco dove l'ho installato C: \ Programmi \ Microsoft Visual Studio .NET 2003 \ Vc7 \ PlatformSDK \ Include. Ci sono altri dettagli negli errori di compilazione da quando lo hai incluso? Com'è il percorso di inclusione? – Dan

risposta

1

ho trovato con l'intestazione stdafx.h che l'ordine includere dovrebbe essere invece:

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

basta cambiare includono dichiarazioni come questa: i file di intestazione

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

ordinazione non importa. Basta assicurarsi che il progetto contenga nelle sue proprietà seguente directory include:

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

in cui si trovano (a priori):

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

Questo è sufficiente a rendere i comandi riconosciuti e compilare senza alcun problema .