On Tue, Jan 07, 2003 at 09:28:19AM -0000, [EMAIL PROTECTED] wrote:
> 
> 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.

Or better still, the DBD::ODBC driver could add ";UID=dbuser;PWD=dbpass;"
to the $dsn automatically if it sees that it matches /\bDSN=/.

Tim.

Reply via email to