Hello all,
  I'm trying to insert images into an Access database (they're small, and 
that's how the app
was built, not my choice), but I'm running into errors.  I'm using...

Windows XP SP1
ActiveState Perl: This is perl, v5.8.3 built for MSWin32-x86-multi-thread
DBI 1.43
DBD::ADO 2.91
Win32::OLE 0.1701
CGI 3.01
CGI::Carp 1.27
Text::CSV_XS 0.23

  I'd appreciate any feedback, and would love to have a solution...

Here's a complete stand-alone script that *should* work, but doesn't, quite...
Oh, you'll need to find the graphics located at the end of the script...

#!perl -w
use strict;

eval { use DBI; };
if ($@) { die "This system does not have the DBI installed!\n"; }
eval { use DBD::ADO; };
if ($@) { die "Database type ADO not supported!\n"; }
eval { use CGI; };
if ($@) { die "CGI module not supported!\n"; }
eval { use CGI::Carp; };
if ($@) { die "CGI::Carp module not supported!\n"; }

my ($dbh, $Access, $AccessDB, $Workspace);
my $db_name = 'C:\development\web\PicsDB\myPics.mdb';
my $ConnStr  = "dbi:ADO:Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine 
Type=5;Data Source=". $db_name;

my $q = new CGI;
my $load = $q->param('load');
my $showPic = $q->param('showPic');
my $show_picID = $q->param('picID');
if ($load) {
  doDBLoad();
} else {
  connectDB();
  if (($showPic) && ($show_picID)) {
    showPic();
  } else {
    showPicLinks();
  }
}
$dbh->disconnect();
exit;

sub showPic {
  my $sqlStatement = "select picType, picData from myPics where picID = ?";
  my $sthSelect = $dbh->prepare($sqlStatement);
  eval {$sthSelect->execute($show_picID); };
  if ($@) { carp("Select statement '$sqlStatement' failed!\nErrors: 
$dbh->errstr \n"); exit; }
  my ($picType, $picData) = $sthSelect->fetchrow_array;
  $sthSelect->finish;
  print $q->header($picType);
  print $picData;
}

sub showPicLinks {
  print $q->header('text/html');
  print $q->start_html("myPics DB Display");
  my $sqlStatement = "select picID, picComment from myPics";
  my $sthSelect = $dbh->prepare($sqlStatement);
  eval {$sthSelect->execute; };
  if ($@) { carp("Select statement '$sqlStatement' failed!\nErrors: 
$dbh->errstr \n"); exit; }
  while (my ($picID, $picComment) = $sthSelect->fetchrow_array ) {
    print "<a 
href='myPics.pl?showPic=1&picID=$picID'><b>$picComment:</b></a><br><img 
src=myPics.pl?showPic=1&picID=$picID><br>\n";
  }
  $sthSelect->finish;
}

sub connectDB {
  eval { $dbh = DBI->connect( $ConnStr, "Admin", "", {RaiseError => 0, 
PrintError => 0, AutoCommit => 1} ); };
  if ($@) { die("Database connection [EMAIL PROTECTED]"); }
  $dbh->{LongReadLen} = 2000000;
  $dbh->{LongTruncOk} = 0;
}

sub doDBLoad {
  no strict 'subs';
  eval { use Text::CSV_XS; };
  if ($@) { die "Text::CSV_XS not supported...\n"; }
  my $csv = Text::CSV_XS->new;
  print "Creating database...\n";
  CreateAccessDB();
  print "Done!\n";
  connectDB();
  eval { 
    use Win32::OLE;
    Win32::OLE->Option(CP => Win32::OLE::CP_UTF8);
  };
  if ($@) { die "Win32::OLE maybe not supported...?\n"; }
  my $create_statement = "create table [myPics] ([picID] INT NOT NULL, 
[picComment] VARCHAR (50), [picType] VARCHAR (50), [picData] IMAGE , ".
                         "PRIMARY KEY ([picID] ), CONSTRAINT myPic_PK UNIQUE 
([picID] ))";
  my $sth = $dbh->prepare($create_statement);
  eval {$sth->execute; };
  if ($@) { die "Create staement failed!\nErrors: $dbh->errstr \n"; }
  my $sqlStatement = "INSERT INTO myPics (picID, picComment, picType, picData) 
VALUES (?, ?, ?, ?)";
  $sth = $dbh->prepare($sqlStatement);
  my $picList = PicList();
  foreach (split("\n", $picList)) {
    if ($csv->parse($_)) {
      my ($picID, $picComment, $picType, $picImage) = $csv->fields;
      if (-e $picImage) {
        print "Loading $picImage into database...";
        my $picData = readblobfile($picImage);
        $sth->bind_param(1, $picID);
        $sth->bind_param(2, $picComment);
        $sth->bind_param(3, $picType);
        #########
        # Errors 
        # 1) Database seems to load, but has extreme bloat, and images do not 
work...
        # 2) OLE exception from "Microsoft JET Database Engine":\n\nParameter 
?_4 has no default value.
        # 3) OLE exception from "ADODB.Command":\n\nApplication uses a value of 
the wrong type for the current operation.
        # 4) OLE exception from "ADODB.Parameter":\n\nArguments are of the 
wrong type, are out of acceptable range, or are in conflict with one another.
        # 5) OLE exception from "Microsoft JET Database Engine":\n\nUnspecified 
error
        #Attemped Binding                                                       
    # Error code
        $sth->bind_param(4, $picData);                                          
   # 1
        #$sth->bind_param(4, $picData, DBI::SQL_GUID );                         
    # 5
        #$sth->bind_param(4, $picData, DBI::SQL_WLONGVARCHAR );                 
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_WVARCHAR );                     
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_WCHAR );                        
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_BIT );                          
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_TINYINT );                      
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_LONGVARBINARY );                
    # 3
        #$sth->bind_param(4, $picData, DBI::SQL_VARBINARY );                    
    # 3
        #$sth->bind_param(4, $picData, DBI::SQL_BINARY );                       
    # 3
        #$sth->bind_param(4, $picData, DBI::SQL_LONGVARCHAR );                  
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_UNKNOWN_TYPE );                 
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_ALL_TYPES );                    
    # 1
        #$sth->bind_param(4, $ImageFile, DBI::SQL_CHAR );                       
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_NUMERIC );                      
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_DECIMAL );                      
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_INTEGER );                      
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_SMALLINT );                     
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_FLOAT );                        
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_REAL );                         
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_DOUBLE );                       
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_DATETIME );                     
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_DATE );                         
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL );                     
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_TIME );                         
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_TIMESTAMP );                    
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_VARCHAR );                      
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_BOOLEAN );                      
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_UDT );                          
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_UDT_LOCATOR );                  
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_ROW );                          
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_REF );                          
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_BLOB );                         
    # 3
        #$sth->bind_param(4, $picData, DBI::SQL_BLOB_LOCATOR );                 
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_CLOB );                         
    # 1
        #$sth->bind_param(4, $picData, DBI::SQL_CLOB_LOCATOR );                 
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_ARRAY );                        
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_ARRAY_LOCATOR );                
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_MULTISET );                     
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_MULTISET_LOCATOR );             
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_TYPE_DATE );                    
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_TYPE_TIME );                    
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_TYPE_TIMESTAMP );               
    # 2
        #$sth->bind_param(4, $picData, DBI::SQL_TYPE_TIME_WITH_TIMEZONE );      
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_TYPE_TIMESTAMP_WITH_TIMEZONE ); 
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_YEAR );                
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_MONTH );               
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_DAY );                 
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_HOUR );                
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_MINUTE );              
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_SECOND );              
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_YEAR_TO_MONTH );       
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_DAY_TO_HOUR );         
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_DAY_TO_MINUTE );       
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_DAY_TO_SECOND );       
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_HOUR_TO_MINUTE );      
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_HOUR_TO_SECOND );      
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTERVAL_MINUTE_TO_SECOND );    
    # 4
        #$sth->bind_param(4, $picData, DBI::SQL_INTEGER);                       
    # 4
        eval { $sth->execute; };
        if ($@) {
          print "Graphic import failed for image $picImage\n";
          $dbh->disconnect;
          exit(255);
        }
        print "  Done!\n";
      } else { print "Could not find image $picImage; not loaded!\n"; }
    } else { print "CSV parsing failed!\n"; }
  }
}

sub readblobfile($) {
  my $file = shift; #get file name
  local( $/, *FILE); #see perldoc perlvar for an explanation here
  open(FILE, "$file") or die "$!";
  binmode(FILE);
  my $content = <FILE>;
  close(FILE);
  return $content;
}

sub CreateAccessDB {
  if ( -e "$db_name") { # if the file already exists, delete it
    unlink("$db_name") || die("Could not delete the old database file 
$db_name\n");
  }
  eval { use Win32::OLE; };
  if ($@) { die "Win32::OLE not supported...\n"; }
  eval { use Win32::OLE::Const 'Microsoft ActiveX Data Objects'; };
  if ($@) { die "ADO maybe not supported...?\n"; }
  eval {
    $AccessDB = Win32::OLE->new("ADOX.Catalog");
    $AccessDB->Create("Provider='Microsoft.Jet.OLEDB.4.0';Jet OLEDB:Engine 
Type=5;Data Source='". $db_name ."'");
  };
  if ($@) { die "Couldn't create the database $db_name...!\n"; }
  Win32::OLE->Uninitialize;
}
  
sub PicList {
  my $picList = <<'EOF';
1,The Charter Communications 
Logo,image/gif,C:\development\web\PicsDB\Charter_Logo.gif
2,The Google Logo,image/gif,C:\development\web\PicsDB\Google_Logo.gif
3,The Yahoo Logo,image/gif,C:\development\web\PicsDB\Yahoo_Logo.gif
4,The AOL Logo,image/gif,C:\development\web\PicsDB\AOL_Logo.gif
EOF
  return($picList);
}


Thanks much!
amonotod

--

    `\|||/         amonotod@    | sun|perl|windows
      (@@)         charter.net  | sysadmin|dba
  ooO_(_)_Ooo____________________________________
  _____|_____|_____|_____|_____|_____|_____|_____|

Reply via email to