SQL Connect mit Winapi funkz nicht



  • hi
    ich will eine sql verbindung mit einem entfernten (aber lokalem LAN) MS SQL Server aufnehmen

    der entfernte Computername ist "SERVER"
    der SQL Instanz Name ist "test"
    user ist "sa" - kein pass

    ich habe im Internet http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcconnecting_with_sqlconnect.asp und http://www.willemer.de/informatik/db/odbcapi.htm)einen Beispiel code gefunden, der zu einer Datenbank verbinden soll.
    Aber es klappt nicht.

    als retCode bei sqlconnect kriege ich immer einen Fehler von 0xCCCC zurück.
    Dabei komme ich in MSDEV 2003 über den Datenbank Explorer auf die Datenbank ohne Probleme.

    Was mache ich falsch???

    THX

    // sqlconsoletest.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include "windows.h"
    #include <sql.h>
    #include <sqlext.h>
    
    #define MYSQLSUCCESS(rc) ((rc==SQL_SUCCESS)||(rc==SQL_SUCCESS_WITH_INFO))
    HSTMT hstmt;
    HENV hEnv;
    HDBC hDBC;
    SQLRETURN retCode;
    
    unsigned char szData[1000];  
    
    void error_out(void)
    {
       unsigned char szSQLSTATE[10];
       SDWORD nErr;
       unsigned char msg[SQL_MAX_MESSAGE_LENGTH+1];
       SWORD cbmsg;
    
       while(SQLError(0,0,hstmt,szSQLSTATE,&nErr,msg,sizeof(msg),&cbmsg)==
       SQL_SUCCESS)
       {
          wsprintf((char *)szData,"Error:\nSQLSTATE=%s,Native  error=%ld,msg='%s'",
             szSQLSTATE,nErr,msg);
          MessageBox(NULL,(const char *)szData,"ODBC Error",MB_OK);
    
       }
    
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);  
    	SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
    	SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDBC);
    	if (hDBC) {
    //**************** hier FEHLER *************************
    
    		retCode = SQLConnect(hDBC, (UCHAR *)"SERVER\\test", SQL_NTS, 
    							(UCHAR *)"sa",SQL_NTS,(UCHAR *)"",0);
    
    		//SQLAllocStmt(hDBC,&hstmt);
    		// Deallocate handles, display error message, and exit.
    		if (!MYSQLSUCCESS(retCode))
    		{
    			SQLFreeEnv(hEnv);
    			SQLFreeConnect(hDBC);
    			error_out();
    			exit(-1);
    		}
    
    		HSTMT hStmt;
    		RETCODE retCode;
    		char strPerformer[1024];
    		char strTitle[1024];
    		long len;
    
    			retCode = SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStmt);
    			if (retCode==SQL_SUCCESS || retCode==SQL_SUCCESS_WITH_INFO) {
    retCode = SQLExecDirect(hStmt, (UCHAR*)"SELECT * FROM roVNC", SQL_NTS);
    				if (retCode==SQL_SUCCESS || retCode==SQL_SUCCESS_WITH_INFO) {
    					SQLBindCol(hStmt, 1, SQL_C_CHAR, strPerformer, 1024, &len);
    					SQLBindCol(hStmt, 2, SQL_C_CHAR, strTitle, 1024, &len);
    					while (1) {
    						retCode = SQLFetch(hStmt);
    						if (retCode==SQL_SUCCESS || retCode==SQL_SUCCESS_WITH_INFO) {
    							MessageBox(0, strTitle, strPerformer, MB_OK);
    						}else {
    							break;
    						}
    					}
    				} else {
    					MessageBox(0,"ExecDirect failed", "bad", MB_OK);
    				}
    				SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
    			}else{
    				MessageBox(0,"Statement failed", "bad", MB_OK);
    			}
    
    		SQLDisconnect(hDBC);
    		SQLFreeHandle(SQL_HANDLE_DBC, hDBC);
    	}
    	SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    
    	return 0;
    }
    


  • benutze nun diesen code:
    und kriege als Fehler:

    [Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht gefunden, und
    es wurde kein Standardtreiber angegeben

    int _tmain(int argc, _TCHAR* argv[])
    {
       HENV   hEnv = NULL; // Env Handle from SQLAllocEnv()
       HDBC   hDBC = NULL; // Connection handle
       HSTMT  hStmt = NULL;// Statement handle
       UCHAR  szDSN[SQL_MAX_DSN_LENGTH] = "SERVER\\test";// Data Source Name buffer
       UCHAR  szUID[10] = "test";// User ID buffer
       UCHAR  szPasswd[10] = "test";// Password buffer
       UCHAR  szModel[128];// Model buffer
       SDWORD cbModel;// Model buffer bytes recieved
       char   buff[9] = "Testing";
       UCHAR  szSqlStr[128]= "INSERT into (Tablename) (ColumnName) Values ('Testing')" ;
    
       RETCODE retcode;
    
      //sprintf((char*)szSqlStr,"INSERT into (Tablename)(Columname) Values ('%s')",buff);
      // Allocate memory for ODBC Environment handle
      SQLAllocEnv (&hEnv);
    
      // Allocate memory for the connection handle
      SQLAllocConnect (hEnv, &hDBC);
    
      // Connect to the data source "test" using userid and password.
      retcode = SQLConnect (hDBC, szDSN, SQL_NTS, szUID, SQL_NTS, szPasswd, SQL_NTS);
    
    #define MSG_LEN 256 /* error message buffer length */
    UCHAR sqlState[6]; /* buffer to store SQLSTATE */
    SDWORD nativeErr; /* native error code */
    UCHAR errMsg[MSG_LEN]; /* buffer to store error message */
    SWORD realMsgLen; /**/
    
    retcode = SQLError(hEnv, hDBC, hStmt, sqlState,
    		&nativeErr, errMsg, MSG_LEN, &realMsgLen);
    	printf((char*)errMsg);
    
      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
      {
          // Allocate memory for the statement handle
          retcode = SQLAllocStmt (hDBC, &hStmt);  
    
          // Prepare the SQL statement by assigning it to the statement handle
          retcode = SQLPrepare (hStmt, szSqlStr, sizeof (szSqlStr)); 
    
          // Execute the SQL statement handle
          retcode = SQLExecute (hStmt);    
    
          // Project only column 1 which is the models
          SQLBindCol (hStmt, 1, SQL_C_CHAR, szModel, sizeof(szModel), &cbModel);
    
          // Get row of data from the result set defined above in the statement
          retcode = SQLFetch (hStmt);
    
          // Free the allocated statement handle
          SQLFreeStmt (hStmt, SQL_DROP);
    
          // Disconnect from datasource
          SQLDisconnect (hDBC);
      }    
    
      // Free the allocated connection handle
      SQLFreeConnect (hDBC);  
    
      // Free the allocated ODBC environment handle
      SQLFreeEnv (hEnv);
    
      return 0;
    }
    
    /*	SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);  
    	SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
    	SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDBC);
    	if (hDBC) {
    		retCode = SQLConnect(hDBC, (UCHAR *)"DYNGATESERVER\\roxtra", SQL_NTS, 
    							(UCHAR *)"sa",SQL_NTS,(UCHAR *)"",0);
    
    		int i = GetLastError();
    
    		//SQLAllocStmt(hDBC,&hstmt);
    		// Deallocate handles, display error message, and exit.
    		if (!MYSQLSUCCESS(retCode))
    		{
    			SQLFreeEnv(hEnv);
    			SQLFreeConnect(hDBC);
    			error_out();
    			exit(-1);
    		}
    
    		HSTMT hStmt;
    		RETCODE retCode;
    		char strPerformer[1024];
    		char strTitle[1024];
    		long len;
    
    			retCode = SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStmt);
    			if (retCode==SQL_SUCCESS || retCode==SQL_SUCCESS_WITH_INFO) {
    				retCode = SQLExecDirect(hStmt, (UCHAR*)"SELECT * FROM roVNC", SQL_NTS);
    				if (retCode==SQL_SUCCESS || retCode==SQL_SUCCESS_WITH_INFO) {
    					SQLBindCol(hStmt, 1, SQL_C_CHAR, strPerformer, 1024, &len);
    					SQLBindCol(hStmt, 2, SQL_C_CHAR, strTitle, 1024, &len);
    					while (1) {
    						retCode = SQLFetch(hStmt);
    						if (retCode==SQL_SUCCESS || retCode==SQL_SUCCESS_WITH_INFO) {
    							MessageBox(0, strTitle, strPerformer, MB_OK);
    						}else {
    							break;
    						}
    					}
    				} else {
    					MessageBox(0,"ExecDirect failed", "bad", MB_OK);
    				}
    				SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
    			}else{
    				MessageBox(0,"Statement failed", "bad", MB_OK);
    			}
    
    		SQLDisconnect(hDBC);
    		SQLFreeHandle(SQL_HANDLE_DBC, hDBC);
    	}
    	SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    
    	return 0;
    }
    


  • Also es geht, wenn ich einen DSN Eintrag anlege, über die ODBC Verwaltung.

    Aber warum muss ich das überhaupt machen? Andere Anwendungen (DBmgrK und MSDEV .NET) können es auch ohne!

    Über .NET mache ich einfach folgendes:

    sqlConn=new SqlConnection();
    
    sqlConn.ConnectionString= "User ID=test; Password=test; Initial Catalog=test; Data Source=testserer\testSQL";
    
    sqlConn.Open();
    if (sqlConn.State != System.Data.ConnectionState.Open)
    return false;
    

    Funktioniert Wunderbar.

    Jetzt nur noch mit der Winapi?!


Anmelden zum Antworten