Exemple de programme ODBC pour SQL Server
Bonjour à tous,
Je souhaiterais me connecter en C++ via ODBC à une source de données distante sous MS SQL Server.
Je voudrais spécifier l'adresse IP dans les paramètres de connexion (sqlDriverConnect).
Est-ce que quelqu'un peut me fournir un exemple SVP?
Je vous fournis mon code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <stdio.h>
int main () {
// Déclaration des variables SQL
SQLRETURN retcode;
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
char* param_con = "DRIVER={SQL SERVER}; Address=10.0.0.200:1433; Trusted_Connection=No; UID=mon_UID; PWD=mon_PWD;";
// setting environnement handle
retcode=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
// Setting ODBC Driver version
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode=SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3,0);
else printf("Erreur sur l'instruction SQLAllocHandle !\n");
// setting connection handle
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode=SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
else printf("Erreur sur l'instruction SQLSetEnvAttr !\n");
// Connection to database
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode = SQLDriverConnect(hdbc, NULL, (SQLWCHAR*) param_con, SQL_NTS, NULL, SQL_NTS, NULL, SQL_DRIVER_COMPLETE);
else printf("Erreur sur l'instruction SQLAllocHandle !\n");
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
retcode=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
else printf("Erreur sur l'instruction SQLConnect !\n");
// Déconnexion
//SQLFreeStmt(hstmt, SQL_DROP);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
// Pause
system("PAUSE");
return 0;
} |
Utilisation de la fonction OpenEx de ODBC
J'ai trouvé une alternative. Le code ci-dessous fonctionne chez moi. J'utilise la classe CDatabase de MFC qui utilise les fonction SQLDriverConnect(...) et autres méthodes de l'API ODBC.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
#define _AFXDLL
#include <afxdb.h>
#include <iostream>
#include <string>
using namespace std;
string convertCT2CA (CString cstring_in) {
CT2CA pszConvertedAnsiString (cstring_in);
std::string strStd (pszConvertedAnsiString);
return strStd;
}
int main () {
CDatabase db;
try {
// le caractère '\' doit être doublé, car caractère spécial
if(!db.OpenEx(_T("Driver={SQL Server};Trusted_Connection=no;DATABASE=myDB;SERVER=10.0.0.100\\SQLEXPRESS;UID=myUID;PWD=myPWD;PORT=1433;OPTION=8;"))) {
cout << "Wrong parameter(s)" << endl;
return (-1);
}
}
catch (CDBException* pEx) {
cout << "Impossible d'ouvrir la base de donnees" << endl;
AfxMessageBox(pEx->m_strError);
pEx->Delete();
return (-1);
}
// Unicode
CString Request = _T("SELECT * FROM phone_nb");
CRecordset rs(&db);
// Exécution de la requete
if (!rs.Open(CRecordset::dynamic,Request)) {
rs.Close();
return (-1);
}
CDBVariant* varValue = new CDBVariant;
short nFields = rs.GetODBCFieldCount();
while (!rs.IsBOF() && !rs.IsEOF()) { // Pour parcourir tous les champs
for (int index = 0; index < nFields; index++) {
try {
rs.GetFieldValue(index, *varValue);
cout << convertCT2CA(*(varValue->m_pstring));
}
catch (CDBException* Expt) {
AfxMessageBox(Expt->m_strError);
Expt->Delete();
}
}
try { // champs suivant
rs.MoveNext();
}
catch( CDBException* Execp) {
AfxMessageBox(Execp->m_strError);
Execp->Delete();
break;
}
}
// libération espace mémoire pour les objets
rs.Close();
db.Close();
delete varValue;
return (-1);
} |
Connexion base de données
Les deux exemples ci-dessus fonctionnent. Il faut définir correctement la chaine de connexion au serveur SQL, comme définit sur le site:
http://www.connectionstrings.com/