C++ API SQLDriverConnect
Je suis à l'aide de visual studio 2008 et sql server 2008 pour le développement de l'application(SQL server est dans mon système). J'ai besoin de récupérer certains champs de la base de données. Je suis l'aide de la SQLDriverConnect API pour se connecter à la base de données.
Si j'utilise le "SQL_DRIVER_PROMPT" je vais obtenir pop fenêtre pour sélectionner la source de données. Je ne veux pas que cette fenêtre apparaisse. Selon ma compréhension de cette fenêtre apparaît si nous fournissent que des informations insuffisantes dans la chaîne de connexion. Je pense que j'ai fourni toutes les informations. Je suis en train d'essayer de se connecter avec l'authentification windows. J'ai essayé différentes options, mais toujours pas de chance. Merci de m'aider dans la résolution de ce problème.
Ci-dessous le code que j'utilise:
//********************************************************************************
//SQLDriverConnect_ref.cpp
//compile with: odbc32.lib user32.lib
#include <windows.h>
#include <sqlext.h>
int main() {
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;
SQLWCHAR OutConnStr[255];
SQLSMALLINT OutConnStrLen;
SQLCHAR ConnStrIn[255] =
"DRIVER={SQL Server};SERVER=(local);DSN=MyDSN;DATABASE=MyDatabase;Trusted_Connection=yes;";
//SQLWCHAR *ConntStr =(SQLWCHAR *) "DRIVER={SQL Server};DSN=MyDSN;";
HWND desktopHandle = GetDesktopWindow(); //desktop's window handle
//Allocate environment handle
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//Set the ODBC version environment attribute
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0);
//Allocate connection handle
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//Set login timeout to 5 seconds
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
retcode = SQLDriverConnect( //SQL_NULL_HDBC
hdbc,
desktopHandle,
(SQLWCHAR *)ConnStrIn,
SQL_NTS,
OutConnStr,
255,
&OutConnStrLen,
SQL_DRIVER_NOPROMPT);
//Allocate statement handle
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//Process data
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
}
//********************************************************************************
Merci d'avance,
Harsha
Vous devez vous connecter pour publier un commentaire.
Utiliser SQLConnect pour se connecter, il ne prévoit pas de dispositions pour les invites.Oups!. Mauvaise idée. Selon la documentation pour SQLDriverConnect, SQLConnect accepte uniquement: DSN, UID, et PW.
Vous devez passer le pointeur NULL pour le hwnd, lors de l'appel de SQLDriverConnect, si vous ne souhaitez pas autoriser les invites. Spécifier SQL_DRIVER_NOPROMPT pour l'option d'invite (comme vous le faites). Si l'appel échoue, examinez la sortie de code de réponse, et d'imprimer les messages.
Voici comment vous pouvez faire la vérification:
Et voici comment vous appelez l'appel: