Re: mySQL and SQLDriverConnect
Igor Korot <[email protected]>
| Newsgroups | gmane.comp.db.unixodbc.devel |
|---|---|
| Message-ID | <24517719.1214030315780.JavaMail.root@elwamui-darkeyed.atl.sa.earthlink.net> |
Nick, -----Original Message----- >From: Nick Gorham <[email protected]> >Sent: Jun 20, 2008 12:16 PM >To: Igor Korot <[email protected]>, Development issues and topics for unixODBC <[email protected]> >Subject: Re: [unixODBC-dev] mySQL and SQLDriverConnect > >Igor Korot wrote: > >>Nick, >> >>-----Original Message----- >> >> >>>From: Nick Gorham <[email protected]> >>>Sent: Jun 20, 2008 8:36 AM >>>To: Igor Korot <[email protected]> >>>Cc: Development issues and topics for unixODBC <[email protected]> >>>Subject: Re: [unixODBC-dev] mySQL and SQLDriverConnect >>> >>>Igor Korot wrote: >>> >>> >>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>By the way, when you say you explicitly call the non unicode function, >>>>>do you mean you call SQLDriverConnectA, becaue with UNICODE defined >>>>>SQLDriverConnect becomes SQLDreiverConnectW (as it does in windows) >>>>> >>>>> >>>>> >>>>> >>>>retcode = SQLDriverConnect( m_hdbc, parentWnd, (SQLTCHAR FAR *)"DSN=test;", ...); >>>> ^^^^^^^^^^^^^^ >>>> >>>>I am doing casting of the parameters. >>>>In UNICODE version, this would become (SQLWCHAR FAR *). >>>> >>>>So, unless the linker is not smart, he should look at the proper signature of the >>>>function. >>>> >>>> >>>> >>>> >>>> >>>Not entirly correct >>> >>>(SQLTCHAR FAR *)"DSN=test;" >>> >>>when UNICODE is defined, will create a SQLWCHAR * pointer, but the thing it points to will still be a char string; >>> >>>I think thats the problem, you are passing the address 8bit string into a function thats expecting a 16bit sequence of values. Casting the pointer to a pointer of another type will not alter the thing thats being pointed to. >>> >>>Remember C will do what you tell it to, even if thats not what you want it to do :-) >>> >>> >> >>Ok, it is very easy to check. ;-) >>It is morning here and I'm at work. When I come home, I will enable ODBC logging and run my >>program. Hopefully you are right, I was just banging my head over nothing and simply passing: >>"DSN=test;" without casting should fix the issue. >> >> > >No, that sill wont work, you either need to pass a wide string, or >force the use of the ansi function > >SQLWCHAR str[] = { 'D','S','N','='.''t','e','s','t',';',0 }; >SQLDriverConnect( ... str, SQL_NTS, ... ); > >or > >SQLCHAR *str = "dsn=test;"; >SQLDriverConnectA( ..., str, SQL_NTS, ... ); > >-- >Nick Gorham >Easysoft Limited >http://www.easysoft.com, http://www.unixODBC.org > I turned the logging on and here is the output and my code: [code] wchar_t *temp_in = new wchar_t[connectStr.length()+1]; RETCODE retcode; if( FwdOnlyCursors() ) { retcode = SQLSetConnectOption( m_hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED ); if( retcode != SQL_SUCCESS ) wxLogError( _T( "SQLSetConnectionOption(CURSOR_LIB) failed!!" ) ); } SQLTCHAR outConnectStr[SQL_MAX_CONNECTSTR_LEN+1]; short outConnectStrLen; wxStrcpy( (char *) temp_in, connectStr ); temp_in[connectStr.length()] = '\0'; retcode = SQLDriverConnect( m_hdbc, parentWnd, (SQLTCHAR FAR *)temp_in, (SWORD) connectStr.length(), (SQLTCHAR FAR *) outConnectStr, WXSIZEOF( outConnectStr ), &outConnectStrLen, #ifdef __WXMSW__ SQL_DRIVER_PROMPT ); #endif #ifdef __WXGTK__ SQL_DRIVER_NOPROMPT ); #endif [/code] where connectStr = _T("Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=test;User=root;Password=wasqra;Option=3;" ) and the log: [code] [ODBC][6916][__handles.c][447] Exit:[SQL_SUCCESS] Environment = 0x81c7408 [ODBC][6916][SQLSetEnvAttr.c][182] Entry: Environment = 0x81c7408 Attribute = SQL_ATTR_ODBC_VERSION Value = 0x3 StrLen = 0 [ODBC][6916][SQLSetEnvAttr.c][349] Exit:[SQL_SUCCESS] [ODBC][6916][SQLAllocHandle.c][358] Entry: Handle Type = 2 Input Handle = 0x81c7408 [ODBC][6916][SQLAllocHandle.c][476] Exit:[SQL_SUCCESS] Output Handle = 0x81c7998 [ODBC][6916][SQLSetConnectOptionW.c][160] Entry: Connection = 0x81c7998 Option = SQL_ATTR_ODBC_CURSORS Value = 0 [ODBC][6916][SQLDriverConnectW.c][246] Entry: Connection = 0x81c7998 Window Hdl = 0x8192180 Str In = [Die=MSLOB .1Die}Sre=oahs;aaaets;srro;asodwsr;pin3][length = 98] Str Out = 0xbfac0bb0 Str Out Max = 1025 Str Out Ptr = 0xbfac1bb6 Completion = 0 [ODBC][6916][SQLDriverConnectW.c][433]Error: IM002 [/code] So, it looks like the connection string is passed as a UNICODE in the UNICODE DM function. Thank you for the hint. Now I know what I need to look for... Thank you. _______________________________________________ unixODBC-dev mailing list [email protected] http://mail.easysoft.com/mailman/listinfo/unixodbc-dev