Bonjour,

J'ai créé un serveur via SQL Server 2008 et une base de données via SQL Server Management Studio.
J'aimerais désormais faire une petit exécutable avec WinForms sous Visual C++ 2010 Express pour envoyer des requêtes, mettre en forme les résultats de celles-ci...
J'ai cru comprendre qu'il n'était pas possible par défaut d'accéder à une base de données avec la version Express.
1) Est-ce vrai?

J'ai donc un peu cherché et je suis tombé sur Platform SDK qui apparemment permet d'accéder à des bases de données depuis Visual Studio.
2) Est-ce vraiment le cas?

J'ai réussi à avoir accès aux fonctions qui l'intéressent pour créer une connection à une base de données.
Afin de tester la connection à la base, je l'ai encapsulé ans le code d'un Bouton :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
private: System::Void button1_Click_1(System::Object^  sender, System::EventArgs^  e) {
			SQLHANDLE hEnv; // ODBC Environment handle
			SQLHANDLE hDbc; // ODBC Connection handle
			SQLHANDLE hStmt; // ODBC Statement handle
			SQLRETURN status;
			SQLSMALLINT   i, MsgLen;
			SQLWCHAR       SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
			SQLINTEGER    NativeError;
 
			status = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
			status = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
			status = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
			status = SQLConnect(hDbc,(SQLWCHAR *) "MONPC\SQLEXPRESS", 16, (SQLWCHAR *)"MONPC\MONLOGIN", 14, (SQLWCHAR *)"", 0);
			i = 1;
			status = SQLGetDiagRec(SQL_HANDLE_STMT, hStmt, i, SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen);
 
			status = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
			status = SQLSetStmtAttr(hStmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_STATIC, 0);
			status = SQLExecDirec	t(hStmt, (SQLWCHAR*) "Select * from Amateurs", (SQLINTEGER) 22);
			int rowcnt;						// variable to hold row count
			rowcnt = 0;						// initialize row counter
			while (true && rowcnt<100)						// loop forever
			{
				status = (SQLRETURN)SQLFetch(hStmt);			// fetch a row of data
				if (status == SQL_NO_DATA_FOUND) break;		// if No Data was returned then exit the loop
				rowcnt++;					// add 1 to the row counter
			}
			printf("There were %d rows of data returned by the SQL Statement.\r\n", rowcnt);
			status = SQLCloseCursor(hStmt);
			if (status == SQL_SUCCESS || status == SQL_SUCCESS_WITH_INFO) {
			}
			else {
				printf("Error with SQLCloseCursor...\r\n");
			}
			status = SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
			status = SQLDisconnect(hDbc);
			status = SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
			status = SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
		 }
En exécutant pas à pas, ma variable status passe à -1 après l'appel de SQLConnect. Je n'en ai pas la certitude mais il me semble que c'est le code SQL_ERROR
3/ Est-ce vrai?

Je pense que mon utilisation de SQLConnect n'est pas correcte.
4) Ma base est paramétrée avec Windows Authentification, j'utilise donc mon login Windows, je n'ai pas de mot de passe sur Windows, est-ce un problème?
5) Mes appels sont-ils corrects?
6) Y aurait-il quelque chose que j'aurais oublié de faire?


J'ai essayé de comprendre l'erreur avec la fonction SQLGetDiagRec mais je ne comprends rien à ce que me renvoie cette fonction dans SQLState :

SqlState "" wchar_t[]
[0] 3 L'' wchar_t
[1] 0 L'' wchar_t
[2] 59592 L'' wchar_t
[3] 20 L'' wchar_t
[4] 10 L'' wchar_t
[5] 0 L'' wchar_t

Quelqu'un peut-il m'aider à déchiffrer ce code d'erreur?

Par ailleurs, status passe à -2 après l'appel de SQLGetDiagRec

Merci d'avance