Hi Ya,

How to this has always been somewhat fuzzy in my head. I looked around
for tools unsuccessfully . So I thought I'd share my solution.

I've just written a simple Perl script to do this, this uses DBI:mysql
to write to mysql and DBI:ODBC to read from Access. I suppose it could
be rewritten in PHP as well.


The tables map practically one to one, but the script could easily be
adapted for a more complex conversion. I presume it could be adapted
to do a reverse conversion as well.

Any suggestions/improvements welcome

#!/usr/local/bin/perl
# convert.pl
# description : Copy Access Database via DBI:ODBC to MySQL
# V1.0 07/01/2004

my $dsn="group";
my $dsn_mysql="group";
my $table="group";
my $table_dest="ytbl_agents";
my $db; # database handle
my $db_dest; # database handle

$delete_sql=qq|DROP TABLE IF EXISTS ytbl_agents|;
$recreate_table =qq|
CREATE TABLE ytbl_agents (
  intID mediumint(9) unsigned NOT NULL auto_increment,
  txtRegion varchar(60) default NULL,
  txtCompany varchar(60) default NULL,
  txtContact varchar(60) default NULL,
  txtAddress text,
  txtTown varchar(60) default NULL,
  txtCounty varchar(60) default NULL,
  txtPostCode varchar(20) default NULL,
  txtPhone varchar(60) default NULL,
  txtFax varchar(50) default NULL,
  txtEmail varchar(60) default NULL,
  txtWeb varchar(60) default NULL,
  dtmDate timestamp(14) default NULL,
  PRIMARY KEY  (intID)
) TYPE=MyISAM;
|;

# YYYYMMDDHHMMSS
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);
$year+=1900; $mon++;
$mysql_timestamp = sprintf(
"%04d%02d%02d%02d%02d%02d",$year,$mon,$mday,$hour,$min,$sec);
#-------------------------------------------------------------#

&open_access_db();
&open_mysql_db();
$cnt=&fn_read_access_db();
&fn_write_to_mysql();
print "\n$cnt records imported to mysql database $dsn_mysql (table
$table_dest)\n";
$db->disconnect();
$db_dest->disconnect();

#-------------------------------------------------------------#

sub open_access_db()
{
use DBI;
use DBD::ODBC; 
 
my $emsg="Could not access the Database\n Could not open DSN $dsn";

$db = DBI->connect( "dbi:ODBC:$dsn", "", "",
    {RaiseError => 1,
     PrintError => 1,
     AutoCommit => 1,
     LongReadLen => 4000} ) or
do
{
print ("$emsg: " . $DBI::errstr .__LINE__."\n");
exit;
}
}
#-------------------------------------------------------------#


sub open_mysql_db()
{
use DBI;
use DBD::MYSQL; 
 
my $emsg="Could not access the Database\n Could not open DSN
$dsn_mysql";

$db_dest = DBI->connect( "dbi:mysql:$dsn_mysql", "", "",
    {RaiseError => 1,
     PrintError => 1,
     AutoCommit => 1,
     LongReadLen => 4000} ) or
do
{
print ("$emsg: " . $DBI::errstr .__LINE__."\n");
exit;
};
### delete table
$sel_dest = $db_dest->prepare( "$delete_sql" );
$sel_dest->execute() or &webdie("\n$delete_sql \n: ".$DBI::errstr."
line ".__LINE__);
### recreate table
my $sel_dest = $db_dest->prepare( "$recreate_table" );
$sel_dest->execute() or &webdie("\n$recreate_table \n:
".$DBI::errstr." line ".__LINE__);

}
#-------------------------------------------------------------#
sub fn_read_access_db
{
   my $sql=qq|select * from "$table" |;
   my $emsg="$sql";
   my $sel = $db->prepare( "$sql" );
   $sel->execute() or &webdie("$emsg : ".$DBI::errstr." line
".__LINE__);

   @results=();
   while (my $ref=$sel->fetchrow_hashref)
   {
      push @results, {%$ref}; # array of hashes
      undef $ref;
   }
   return $#results+1;
}
#-------------------------------------------------------------#
sub fn_write_to_mysql()
{
my $cols =qq|txtRegion,  txtCompany, txtContact, txtAddress, txtTown,
txtCounty, txtPostCode|;
   $cols.=qq|, txtPhone, txtFax, txtEmail, txtWeb, dtmDate|;
for my $resid (0 .. $#results)
{
my $ID= $results[$resid]{"ID"};
my $region=escsql($results[$resid]{"region"});
my $company=escsql($results[$resid]{"company"});
my $contact=escsql($results[$resid]{"contact"});
my $address=escsql($results[$resid]{"address"});
my $town=escsql($results[$resid]{"town"});
my $county=escsql($results[$resid]{"county"});
my $postcode=escsql($results[$resid]{"postcode"});
my $tel=escsql($results[$resid]{"tel"});
my $fax=escsql($results[$resid]{"fax"});
my $email=escsql($results[$resid]{"email"});
my $web=escsql($results[$resid]{"web"});

my $vals
=qq|'$region','$company','$contact','$address','$town','$county','$postcode','$tel','$fax','$email','$web'|;
   $vals.=qq|,'$mysql_timestamp'|;
#print $cols; print "\n".$vals; exit;
my $sql=qq|insert into $table_dest |;
      $sql.=qq| ($cols) values ($vals)   |;
my $sel_dest = $db_dest->prepare( "$sql" );
   $sel_dest->execute() or &webdie("\n$sql \n: ".$DBI::errstr." line
".__LINE__);
}
}
#-------------------------------------------------------------#
sub escsql()
{
    my ($inputstr) = @_ ;
    return "" if (!defined($inputstr)) ; 
    $inputstr =~ s/\\/\\\\/g;
    $inputstr =~ s/\"/\\"/g;
    $inputstr =~ s/\'/\\'/g;
    return($inputstr) ;
}
#-------------------------------------------------------------#

zzapper (vim & cygwin & zsh)
--

vim -c ":%s/^/WhfgTNabgureRIvzSUnpxre/|:%s/[R-T]/ /Ig|:normal ggVGg?"

http://www.vim.org/tips/tip.php?tip_id=305  Best of Vim Tips


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to