On 06-Jan-2003 Jeff Urlwin wrote: > [snip] >> >> BTW, SQLConnect (the ODBC 1.0 function DBD::ODBC can use) has >> a limit on the size of the string you can pass in the first >> argument (I think it is 32). DBD::ODBC used to get around >> this by looking for "DSN=" at the start of the string and >> using SQLDriverConnect instead. I'm not sure without >> examining the source again that a connection string starting >> with "DRIVER=" will go to SQLDriverConnect (which it needs to). > > FYI -- DBD::ODBC checks for DSN= or a strlen(DSN) > SQL_MAX_DSN_LENGTH > and thus should avoid the call to SQLConnect. And, the current version > only falls back to SQLConnect if SQLDriverConnect fails. I believe this > is is "safe" behavior, but any suggestions you have, Martin, are most > welcome.
Sorry for slowness of reply but I've been tinkering with a firewall for a few days and could not access my email (this is ongoing to may happen again over the next few days). Current solution sounds OK to me, I forgot the strlen(DSN_string) > SQL_MAX_DSN_LENGTH bit was there. The only situation I've seen that can be a little confusing is this: DBI->connect('dbi:ODBC:dsnname', 'dbuser', 'dbpass') works and DBI->connect('dbi:ODBC:DSN=dsnname', 'dbuser', 'dbpass') fails with whatever message the database engine returns for invalid user/password (in MS SQL Server it is something to do with NULL user). First time I hit this it took a little head scratching to work out what was going on. In the first case SQLConnect('dsnname', 'dbuser', 'dbpass') is called and as the database engine required a username/password all was OK. In the second case SQLDriverConnect(..., "DSN=dsnname", ...) was called and I got the NULL user error. Adding ";UID=dbuser;PWD=dbpass;" to the "DSN=dsnname" fixes the problem but it can be a little confusing if you don't recognise the problem. Perhaps a note about this in the docs might help. Martin -- Martin J. Evans Easysoft Ltd, UK Development