Perl Win32 :: OLE生成Access数据库

时间:2011-11-23 22:45:35

标签: perl ms-access

所有

[说明]:我正在读取平面文件列表并生成和加载访问数据库。 Windows XP,Perl 5.8.8,无法访问默认安装之外的其他模块。

[问题]:效果,效果,效果。加载所有数据需要大约20分钟。我假设可能有更好的方法来加载数据而不是addnew&更新

[逻辑]:这里没有发布我的很多转换和其他逻辑是我正在尝试的:

  1. 打开文件x
  2. 读取文件x的第0行
  3. jet->从第2步发送的字符串执行Create语句
  4. 读入第1行 - n创建制表符分隔字符串并存储到数组中
  5. 使用select * from tablename
  6. 打开记录集
  7. 表示数组中的每个项目
    1. recordset->的AddNew
    2. 根据标签拆分项目
      1. 表示拆分中的每个项目
        1. rs->字段 - >项目(pos) - > {Value} = item_value
    3. 记录集 - >更新
  8. 谢谢。

1 个答案:

答案 0 :(得分:2)

慢速加载中的一个问题是对每次更新进行提交。确保自动提交已关闭,并且每1000行或其他任何一行执行一次。如果它不是一个巨大的负荷,不要做它们。此外,请勿在加载期间创建索引,然后再创建索引。

另外,我不确定OLE是最好的方法。我使用DBI和Win32 :: ODBC一直加载Access db。快得快。

每个请求,这里是示例加载程序,在WinXP,Access 2003,ActiveState Perl 5.8.8上每分钟做大约100k条记录。

use strict;
use warnings;

use Win32::ODBC;

$| = 1;

my $dsn = "LinkManagerTest";
my $db = new Win32::ODBC($dsn)
    or die "Connect to database $dsn failed: " . Win32::ODBC::Error();

my $rows_added = 0;
my $error_code;

while (<>) {
    chomp;

    print STDERR "."     unless $. % 100;
    print STDERR " $.\n" unless $. % 5000;

    my ($source, $source_link, $url, $site_name) = split /\t/;

    my $insert = qq{
        insert into Links (
            URL,
            SiteName,
            Source,
            SourceLink
        )
        values (
            '$url',
            '$site_name',
            '$source',
            '$source_link'
        )
    };

    $error_code = $db->Sql($insert);

    if ($error_code) {
        print "\nSQL update failed on line $. with error code $error_code\n";
        print "SQL statement:\n$insert\n\n";
        print "Error:\n" . $db->Error() . "\n\n";
    }
    else {
        $rows_added++;
    }

    $db->Transact('SQL_COMMIT') unless $. % 1000;
}

$db->Transact('SQL_COMMIT');
$db->Close();

print "\n";
print "Lines Read: $.\n";
print "Rows Added: $rows_added\n";

exit 0;