L'utilisation d'ODBC pour se connecter à SQL SERVER 2008

Je suis sur un W32 lavable en essayant d'obtenir une connexion avec une base de données. Pour ce faire, j'ai essayé de commencer le test d'un programme d'exemple:

#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);
}

Le problème est que je reçois de NOMBREUX problèmes lorsque vous essayez de compiler, concernant non déclarées, par exemple:

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

Je suis lié à la libodbccpp32.a et libodbc32.a bibliothèques déjà. Qu'est ce que je fais mal?

  • L'erreur semble indiquer que vous n'avez pas inclure l'odbc en-têtes de décrire la sqlhandle/sqlhdesc. Je pense que c'est dans ntodbc.h.
  • Avez-vous une idée de où je peux obtenir ce que l'en-tête?
  • Il semble que l'un est spécifique à l'Sybase SDK, j'ai été à l'aide. Voici une liste de ceux de microsoft. msdn.microsoft.com/en-us/library/ms713603%28v=VS.85%29.aspx. C'est en fait sqltypes.h c'est le kit de développement microsoft un. Voici où je l'ai installé C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include. Sont-il plus de détails dans vos erreurs de compilation puisque vous avez compris que l'un? Quel est votre chemin de ressembler?
  • En fait à peu près toutes les erreurs sont dérivées à partir de ceux-ci et en quelque sorte le même ("erreur: "SQLHDESC' n'a pas été déclarée dans ce champ d'application"). Le chemin est celui de la mingw-têtes qui comprennent chacun de ces. Je ne vois pas un fichier include erreur dans les logs.
  • En fait, j'ai trouvé que l'ajout de l'en-tête stdafx corrige ce. Mais le problème est que la commande que j'ai compris les chemins d'accès (ce qui est étrange, parce qu'ils étaient de cette façon, dans l'exemple). Je vais inclure la façon dont il devrait être pour éviter les problèmes
InformationsquelleAutor Filgera | 2011-03-17