2011-03-17 15 views
6

Estoy en una máquina W32 tratando de obtener una conexión con un DB. A tal fin, he intentado iniciar un programa de pruebas de ejemplo:Uso de ODBC para conectar con 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); 

} 

El problema es que tengo problemas de muchos cuando tratando de recopilar, en cuanto a los tipos no declarados, por ejemplo:

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

me he vinculado a las bibliotecas libodbccpp32.a y libodbc32.a ya. ¿Qué es eso que estoy haciendo mal?

+0

El error parece indicar que no incluyó los encabezados odbc que describen sqlhandle/sqlhdesc. Creo que está en ntodbc.h. – Dan

+0

¿Tiene alguna idea de dónde puedo conseguir ese encabezado? – Filgera

+0

Parece que uno era específico del SDK de Sybase que estaba usando. Aquí hay una lista de los microsoft. http://msdn.microsoft.com/en-us/library/ms713603%28v=VS.85%29.aspx. En realidad es sqltypes.h ese es el microsoft sdk one. Aquí es donde lo he instalado C: \ Archivos de programa \ Microsoft Visual Studio .NET 2003 \ Vc7 \ PlatformSDK \ Include. ¿Hay más detalles en sus errores de compilación ya que ha incluido ese? ¿Cómo se ve el camino? – Dan

Respuesta

1

que he encontrado con cabecera stdafx.hy que el orden debe ser incluir en su lugar:

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

acaba de cambiar incluyen declaraciones como esta: los archivos de cabecera

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

pedidos no importa. Sólo asegúrese de que el proyecto contiene en sus propiedades la siguiente include:

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

donde se encuentran (a priori):

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

Esto es suficiente en la toma de sus comandos reconocidos y compilan sin ningún problema .

Cuestiones relacionadas