After posting to the newsgroup I thought I should post to the dbi-users mailing list 
instead.

I am unable to get a where clause to work against MS SQL Server. I get no runtime 
errors, but my recordset is always empty. I have
the latest version from ActivePerl and Win2000. I just installed DBI and DBD-ODBC 
using PPM so they should be current. To debug I am
displaying the SQL string, and if I paste the string into a MS Access query or 
Enterprise Manager it works fine. I did trial and
error with everything I could think of changing syntax and had no success. This is my 
first Perl application employing a database,
and is a test case to see what we can do in Perl rather than Java. Code is pasted 
below. I changed my posting width to 132
characters to avoid wrapping but usually post with 76. If someone could help I'd 
appreciate it. Thanks

#!e:\perl\bin\perl.exe

   use warnings;
   use strict;
   use DGM;
   use DBI;
   use DBD::ODBC;
   require 'RecipAuthFunc.pl';

   my $select = 'SELECT TOP 201 AuUnique, AuRIN, AuCaseID, AuFirstName, AuLastName, 
AuMiddleInitial, AuSSN FROM Authorize ';
   my ($connection, $recordset, @field, @record, $filter, $count, $toomany);

   RecipAuthStart(1);   #this creates %passed from CGI arguments, insures there are no 
undefs, and writes the HTML header

$passed{'LName'} = 'W';          #this is so I can skip the selection screen
$passed{'queryby'} = 'select+using+name';

   if ($passed{'queryby'} eq 'select+using+RIN') {$filter = "WHERE AuRIN LIKE 
'$passed{'RIN'}*'"}
   elsif ($passed{'queryby'} eq 'select+using+case') {$filter = "WHERE AuCaseID LIKE 
'$passed{'CaseID'}*'"}
   elsif ($passed{'queryby'} eq 'select+using+name') {$filter = "WHERE (AuFirstName 
LIKE '$passed{'FName'}*') AND ".
                                                                "(AuLastName LIKE 
'$passed{'LName'}*') AND ".
                                                                "(AuMiddleInitial LIKE 
'$passed{'Initial'}*')"}
   elsif ($passed{'queryby'} eq 'select+using+SSN') {$filter = "WHERE AuSSN LIKE 
'$passed{'SSN'}*'"}
   elsif ($passed{'queryby'} eq 'select+using+all') {$filter = "WHERE (AuRIN LIKE 
'$passed{'RIN'}*') AND ".
                                                               "(AuCaseID LIKE 
'$passed{'CaseID'}*') AND ".
                                                               "(AuFirstName LIKE 
'$passed{'FName'}*') AND ".
                                                               "(AuLastName LIKE 
'$passed{'LName'}*') AND ".
                                                               "(AuMiddleInitial LIKE 
'$passed{'Initial'}*') AND ".
                                                               "(AuSSN LIKE 
'$passed{'SSN'}*')"}
   else {problem('Invalid invocation')}

print "<br>".$select.$filter.' ORDER BY AuRIN<br>'; #debug

   $connection = DBI->connect("dbi:ODBC:RATS",'RATSDefault','none') or problem('Cannot 
connect to database');
   $recordset = $connection->prepare($select.$filter.' ORDER BY AuRIN') or 
problem('Cannot prepare SQL statement');
   $recordset->execute() or problem('Cannot create recordset');
   $count = 0;
   while (@field=$recordset->fetchrow_array) {
      $count++;
      foreach (@field) {$_ ='' unless $_}
      push @record, [EMAIL PROTECTED];
      }
#   $count = @record;
print "<br>$count<br>"; #debug
   if ($count > 200) {
      $count = 200;
      $toomany = 'Too many records were returned for the selection criteria.<br>Change 
the criteria and do again.';
      }
   else {$toomany = '<br><br>'}

   print '<font size=1.5 face="Arial"><form name="RecipAuth" action="RecipAuthView.pl" 
method="post">';
   print '<table border=0 cellspacing=4 align=center>';
   print '<tr>',tdfont($hidden),
                tdfont($toomany),'</tr>';
   foreach (0..($count-1)) {
      print '<tr>',tdfont($record[$_][0]).  #this is not the final display version of 
course
                   tdfont($record[$_][1]).
                   tdfont($record[$_][2]).
                   tdfont($record[$_][3]).
                   tdfont($record[$_][4]).
                   tdfont($record[$_][5]).
                   tdfont($record[$_][6]),'</tr>';
     }
   print '</table></form></font></body></html>';
   exit;

This is the displayed SQL statement:

SELECT TOP 201 AuUnique, AuRIN, AuCaseID, AuFirstName, AuLastName, AuMiddleInitial, 
AuSSN FROM Authorize WHERE (AuFirstName LIKE
'*') AND (AuLastName LIKE 'W*') AND (AuMiddleInitial LIKE '*') ORDER BY AuRIN

If I remove the where clause and prepare as follows it returns records:
   $recordset = $connection->prepare($select.' ORDER BY AuRIN') or problem('Cannot 
prepare SQL statement');

Reply via email to