SQL Connect mit Winapi funkz nicht
-
hi
ich will eine sql verbindung mit einem entfernten (aber lokalem LAN) MS SQL Server aufnehmender entfernte Computername ist "SERVER"
der SQL Instanz Name ist "test"
user ist "sa" - kein passich 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 angegebenint _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?!