- PR -

Perl5.6.1で「5C」コードを含む文字列をAccessDBから取得した際のエスケープ処理について

1
投稿者投稿内容
TY
会議室デビュー日: 2008/02/27
投稿数: 3
投稿日時: 2008-02-27 17:13
はじめまして。TYです。
Perl5.6.1でCGIを動作させています。(OSはWindows2000Server)
下記コードでAccess2002のデータベース上の「テーブルyyy」から「列xxx」を引っ張ってきて
xxxのValue(文字列)を変数testに格納しようとしているのですが、
xxxのValue(文字列)に2バイト目が「5C」コードの文字(表・予・申など)が含まれる場合、「Can't call method "Fields" on an undefined value at C:\〜〜〜.cgi line 行数」というエラーが発生してしまいます。
(「5C」コードを含まない文字列の場合、正常に実行されます。)
このエラー出力で表示される行数はtestに文字列を格納する行で発生しているのですが、既存のPerl5.6.1のままでエスケープ・置換処理をどのように行えばよいのでしょうか。
以上、よろしくお願い致します。

use Win32::oLE;
$conn ="対象DB等の設定";
$db = Win32::oLE->new("ADODB.Connection");
$db->Open($conn);
$rs = $db->Execute("SELECT xxx FROM yyy WHERE zzz=aaa");
$test=$rs->Fields('xxx')->Value;


[ メッセージ編集済み 編集者: TY 編集日時 2008-02-27 17:23 ]
ノラ
常連さん
会議室デビュー日: 2003/11/06
投稿数: 37
お住まい・勤務地: 東京都
投稿日時: 2008-02-28 13:41
ノラといいます。
推奨しませんが、
コード:
use Win32::OLE;
use Jcode;
$conn ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/db1.mdb;";
$db = Win32::OLE->new("ADODB.Connection");
$db->Open($conn);
Win32::OLE->Option( CP=>Win32::OLE::CP_UTF8, Warn => 3 ); 
$rs = $db->Execute("SELECT a FROM tbl1;");
$test = $rs->Fields('a')->Value;
my $test2 = "";
$test2 = $test2 . $test;
$test2 = Jcode->new($test2,'utf8')->sjis;
print $test2,"\\n";


推奨しない理由は「Perl5.6でのunicode対応にはバグが多い」との巷の話によります。

TY
会議室デビュー日: 2008/02/27
投稿数: 3
投稿日時: 2008-02-29 15:01
ご回答ありがとうございます。
結果から申し上げますと、改善されませんでした。

use Jcode;
Win32::OLE->Option( CP=>Win32::OLE::CP_UTF8, Warn => 3 );
my $test2 = "";
$test2 = $test2 . $test;
$test2 = Jcode->new($test2,'utf8')->sjis;
上記5行をソースに追記したところ、「5C」コードを含まないものもエラーが発生してるわけではないのですが正常な処理を行えませんでした。(「5C」コードを含むものは下記のエラーメッセージ出力)

Win32::OLE->Option( CP=>Win32::OLE::CP_UTF8, Warn => 3 );
の行のみソースに追記したところ、「5C」コードを含まないものは今までどおり正常に処理されたのですが、
「5C」コードを含むものは下記のような、今までと違うエラーメッセージが出力されました。
指定されている行数は「$rs = $db->Execute("SELECT xxx FROM yyy WHERE zzz=aaa"); 」の部分です。

Win32::OLE(0.1701) error 0x80040e14
in METHOD/PROPERTYGET "Execute" at 〜〜〜.cgi line 行数
ノラ
常連さん
会議室デビュー日: 2003/11/06
投稿数: 37
お住まい・勤務地: 東京都
投稿日時: 2008-03-01 01:49
ダメでしたか。
会議室を汚してしまい、申し訳ございませんでした。
なお、当方の環境
Win XP
IIS 5.1
Active Perl Version 5.6.1 build 638
ACCESS 2003
では、現象は再現しませんでした(UTF-8経由にしなくても)。
1

スキルアップ/キャリアアップ(JOB@IT)