Newsgroup: it.comp.programmare.win32
Titolo: accedere db sql server da visual C++ e cgi

Ho scritto (con visual C/C++) il codice di esempio che riporto a fine 
messaggio, per accedere ad un database il cui DBMS e' SQL Server 7.0. 
Se lancio il programma da linea di comando o da IDE ottengo
Content-type: text/html
<html>
  <BODY>
<P>retcode_allocenv=0,retcode_SetEnvAttr=0,retcode_allocconn=0,retcode_connect=1,retcode_allocstatement=0,retcode_execdirect=0
status=, native_error=0 err_ mess=,</P>
  </BODY>
</html>
ovvero esattamente quello che io mi aspetterei da tale codice. 
Il problema e' quando tento di usare questo eseguibile come se
fosse una cgi. Quello che ottengo e' che la SQLConnect fallisce
e cio' che viene stampato e':
retcode_allocenv=0,retcode_SetEnvAttr=0,retcode_allocconn=0,retcode_connect=-1,retcode_allocstatement=15,retcode_execdirect=16
status=IM002, native_error=0 err_mess=[Microsoft][ODBC Driver Manager]
Data source name not found and no default driver specified,
Da cui deduco che per qualche motivo la SQLConnect non
riesce ad individuare il "data source"(cosa che pero' riesce a fare 
correttamente se invocata da linea di comando). Qualcuno sa per quale
motivo puó verificarsi un simile comportamento ?
Grazie in anticipo,
Marco Guidi
// testsqlconnect.cpp : Defines the entry point for the console
application.
//
#include "stdafx.h"
#include "testsqlconnect.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include <sql.h>
#include <sqlext.h>
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
SQLRETURN  retcode_allocenv=11;
SQLRETURN  retcode_SetEnvAttr=12;
SQLRETURN  retcode_allocconn=13;
SQLRETURN  retcode_connect=14;
SQLRETURN  retcode_allocstatement=15;
SQLRETURN  retcode_execdirect=16;
SQLTCHAR status[32];
SQLTCHAR err_mess[1024];
SQLINTEGER native_error;
SQLSMALLINT err_mess_len;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;
	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode = 1;
	}
	else
	{
SQLHENV  henv;
SQLHDBC  hdbc;
SQLHSTMT hstmt;
SQLRETURN  retcode;
      /*Allocate environment handle */
retcode_allocenv=retcode = SQLAllocHandle(SQL_HANDLE_ENV,
SQL_NULL_HANDLE, &henv);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
   /* Set the ODBC version environment attribute */
   retcode_SetEnvAttr=retcode = SQLSetEnvAttr(henv,
SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
      /* Allocate connection handle */
      retcode_allocconn=retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv,
&hdbc);
      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
         /* Set login timeout to 5 seconds. */
 
         //SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT,5, 0);
         /* Connect to data source */
         retcode_connect=retcode = SQLConnect(hdbc, (SQLCHAR*)
"IVLRSTAR_DB", SQL_NTS,
                (SQLCHAR*) "elio", SQL_NTS,
                (SQLCHAR*) "elio", SQL_NTS);
         if (retcode == SQL_SUCCESS || retcode ==
SQL_SUCCESS_WITH_INFO){
            /* Allocate statement handle */
            retcode_allocstatement=retcode =
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
            if (retcode == SQL_SUCCESS || retcode ==
SQL_SUCCESS_WITH_INFO) {
               /* Process data */
               //SQLCHAR *statement_text=(unsigned char *)"sp_help";
               //retcode=SQLPrepare(hstmt,statement_text,strlen((char
*)statement_text));
               //retcode=SQLExecute(hstmt);
               //retcode=SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
                //SELECT * FROM SYSOBJECTS WHERE XTYPE='U'
               retcode_execdirect=retcode =
SQLExecDirect(hstmt,(unsigned char *)"INSERT INTO table1 VALUES
('xxx');",SQL_NTS);
 
 
               if (retcode == SQL_SUCCESS || retcode ==
SQL_SUCCESS_WITH_INFO) {
   unsigned char val[1024];
   SQLINTEGER rv;
   retcode=SQLBindCol(hstmt, 1, SQL_C_CHAR, &val[0], 1023, &rv);
   /* Fetch and print each row of data.  On */
   /* an error, display a message and exit. */
   while (TRUE) {
      retcode = SQLFetch(hstmt);
      if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
         //show_error();
          int a;
           a++;
      }
      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
          printf("%s\n",val);
      } else {
         break;
      }
   }
               }
               SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
            }
            SQLDisconnect(hdbc);
         }
         else
         {
             memset(status,0,sizeof(status));
             memset(err_mess,0,sizeof(err_mess));
             //cerco di capire che errore ottengo:
             SQLGetDiagRec(SQL_HANDLE_DBC,hdbc,1,(unsigned char
*)&status,&native_error,(unsigned char
*)&err_mess,sizeof(err_mess)-1,&err_mess_len);
         }
         SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
      }
   }
   SQLFreeHandle(SQL_HANDLE_ENV, henv);
  }
 }
    printf("Content-type: text/html\n\n") ;
    printf("<html>\n");
    printf("  <BODY>\n");
    printf("
<P>retcode_allocenv=%d,retcode_SetEnvAttr=%d,retcode_allocconn=%d,retcode_connect=%d,retcode_allocstatement=%d,retcode_execdirect=%d
status=%s, native_error=%ld err_mess=%s,</P>\n",
retcode_allocenv,retcode_SetEnvAttr,retcode_allocconn,retcode_connect,retcode_allocstatement,retcode_execdirect,status,native_error,err_mess);
    printf("  </BODY>\n");
    printf("</html>\n");
	return nRetCode;
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Ciao, Marco!
Il giorno 27/10/2003 alle ore 15:51 hai scritto:
 MG> Da cui deduco che per qualche motivo la SQLConnect non
 MG> riesce ad individuare il "data source"(cosa che pero' riesce a fare
 MG> correttamente se invocata da linea di comando). Qualcuno sa per quale
 MG> motivo puó verificarsi un simile comportamento ?
Forse perche' hai inserito il datasource come DSN utente, prova a metterlo
come DSN di sistema.
Bye