Re: ODBC Driver failing?

"Martin J. Evans" <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.general
Organization at home
Message-ID <[email protected]>
On 26/06/2013 17:28, Dan Bent wrote:
> I suddenly lost the ability to connect to my ODBC database yesterday,
> after years of using the same function to establish a connection:
>
> sub dbaseconnect {
>      if (defined($testing)) {
>          if ($testing eq "YES") {
>              $dsn =  'dbi:ODBC:test1' ;
>              print "Using test database\n" ;
>          } elsif ($testing eq "TRAIN") {
>              $dsn =  'dbi:ODBC:train1' ;
>              print "Using train1 database\n" ;
>          } else {
>              $dsn =  'dbi:ODBC:prod1' ;
>          }
>      } else {
>          $dsn =  'dbi:ODBC:prod1' ;
>      }
>      $user =  'USER' ;
>      $passwd =  'PASSWORD' ;
>      my %adrivers = DBI->available_drivers();
>      print join(", ", %adrivers), "\n" ;
>
>      print "connecting to DATABASE $dsn  $user $passwd\n" ;
>      $dbh = DBI->connect($dsn, $user, $passwd,
>                  {RaiseError => 1, AutoCommit => 0})
>          or die "Could not connect to database: " . DBI->errstr ;
>      print "connected to DATABASE $dsn \n" ;
> }
>
> So, to gather information about where the failure is, I ran the
> following program:
>
> #! /usr/bin/perl
>
> use DBI ;
> use DBD::ODBC ;
> use strict ;
> use warnings ;
>
> print "Available Drivers: " ;
> my @adrivers = DBI->available_drivers();
> print join(", ", @adrivers), "\n" ;
>
> print "Data Sources: " ;
> foreach my $driver ( @adrivers ) {
>      print "Driver: $driver\n";
>      my @dataSources = DBI->data_sources( $driver );
>      foreach my $dataSource ( @dataSources ) {
>          print "\tData Source is $dataSource\n";
>      }
>      print "\n";
> }
>
> and the output I got was:
>
> Available Drivers: DBM, ExampleP, File, ODBC, Proxy, Sponge
> Installed Drivers:
> Data Sources: Driver: DBM
>          Data Source is DBI:DBM:f_dir=.
>          Data Source is DBI:DBM:f_dir=CIGNA
>          Data Source is DBI:DBM:f_dir=Logs
>          Data Source is DBI:DBM:f_dir=ONCOURSE
>          Data Source is DBI:DBM:f_dir=autemp
>          Data Source is DBI:DBM:f_dir=config
>          Data Source is DBI:DBM:f_dir=fh.cob
>          Data Source is DBI:DBM:f_dir=perlscripts
>          Data Source is DBI:DBM:f_dir=pndspndwk
>          Data Source is DBI:DBM:f_dir=prgrun_dir
>          Data Source is DBI:DBM:f_dir=scripts
>
> Driver: ExampleP
>          Data Source is dbi:ExampleP:dir=.
>
> Driver: File
>          Data Source is DBI:File:f_dir=.
>          Data Source is DBI:File:f_dir=CIGNA
>          Data Source is DBI:File:f_dir=Logs
>          Data Source is DBI:File:f_dir=ONCOURSE
>          Data Source is DBI:File:f_dir=autemp
>          Data Source is DBI:File:f_dir=config
>          Data Source is DBI:File:f_dir=fh.cob
>          Data Source is DBI:File:f_dir=perlscripts
>          Data Source is DBI:File:f_dir=pndspndwk
>          Data Source is DBI:File:f_dir=prgrun_dir
>          Data Source is DBI:File:f_dir=scripts
>
> Driver: ODBC
>
> and the program just hangs when it looks for data sources using the ODBC
> driver. So, I suspect that there are issues with the ODBC driver. Here
> are the versions of the various DBI module components:
>
>   perl -MDBI -e 'DBI->installed_versions'
>    Perl            : 5.008008    (PA-RISC1.1-thread-multi)
>    OS              : hpux        (11.00)
>    DBI             : 1.50
>    DBD::Sponge     : 11.10
>    DBD::Proxy      : install_driver(Proxy) failed: Can't locate
> RPC/PlClient.pm in @INC
>    DBD::ODBC       : 1.14
>    DBD::File       : 0.33
>    DBD::ExampleP   : 11.12
>    DBD::DBM        : 0.03
>
> I imagine that I may not have the latest versions of everything, and
> updates are probably in order, but, while updates are desirable, I'd
> like to be sure that I'm addressing the root cause of the problem, so I
> get it resolved. This issue affects a lot of programs, and is critical
> to our business.
> Any help or suggestions will be greatly appreciated.
>

You are in deed running VERY old versions - especially of DBD::ODBC.

You first need to think about what Jonathan said - he's probably right 
that working out what changed yesterday is probably going to give the 
quickest result.

Assuming you cannot find anything here are some suggestions.

DBD::ODBC is usually linked to an ODBC driver manager but back in the 
days of 1.14 people still linked directly to an ODBC driver sometimes - 
ODBC drivers did not support enumerating DSNs - only the driver manager 
does that. So first thing is hwo was DBD::ODBC built? If you don't know 
that look for ODBC.so in your perl tree and run the HPUX equivalent of 
Linux's ldd command on it to find what libraries it depends on (right 
now I cannot remember what the command is).

Once you've done that if the answer is libodbc.so.something then you are 
probably using the unixODBC driver manager. In that case you should 
hopefully have an isql binary and you should have an odbc.ini and 
odbcinst.ini defining your drivers and DSNs. What is in those files. Can 
you run:

isql -v TEST1 username password
isql -v TRAIN1 username password
isql -v PROD1 username password

as you didn't say which one you are using?

If you get back with this info I'll help more.

Martin
-- 
Martin J. Evans
Wetherby, UK
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.