ちょっと探してしまったので、ここにメモります。
use strict; use warnings; use utf8; use Encode; use Win32::OLE; use DBI; # BEGIN variable my $FN = 'sample.mdb'; # END variable if (-e $FN) { unlink -e $FN or die; } my $dsn = "Provider=Microsoft.Jet.OLEDB.4.0;"; $dsn .= "Data Source=$FN;"; my $cat = Win32::OLE->new("ADOX.Catalog"); $cat->Create($dsn) or die; $cat->Close(); my $dbh = DBI->connect("dbi:ADO:$dsn") or die $DBI::errstr; $dbh->do( "Create Table song(id int, artist varchar(255), title varchar(255))" ) or die $DBI::errstr; my $sth = $dbh->prepare("INSERT INTO song(id,artist,title) VALUES (?,?,?)"); $sth->execute(1, "The Stalin", encode('cp932', 'ロマンチスト')); $sth->execute(2, "INU", encode('cp932', 'メシ喰うな')); $dbh->disconnect;
おしまい
DBIx::Class::Loader::ADOなんてのもありますな(・∀・)
サンプルコード
$cat->Create($dsn) or die;
で
Died at D:\写真集\画蔵閲覧\gazo-bin\gazo\cgi\sql.pl line 22.
が発生です
環境はwin10です
ファイル名を日本語ものを避ければ通ると思います。
日本語のものを使うのであれば、cp932で渡してあげるか
Win32::OLE->Option( CP => &Win32::OLE::CP_UTF8 );
として utf8 でデコード済みのものを渡します。(use utf8 して UTF-8 でスクリプトを書いていればこちらです。Accessの結果も utf8 になってしまうかと思いますが)
詳しくは。。。
https://metacpan.org/pod/Win32::OLE#CP
http://bokut.in/mt/2012/04/perl-win32-unicode.html
https://metacpan.org/pod/Win32::Unicode
https://metacpan.org/pod/Win32::LongPath
encode( cp932 => $fn )