Perl Win32::OLE 生成访问数据库

Posted

技术标签:

【中文标题】Perl Win32::OLE 生成访问数据库【英文标题】:Perl Win32::OLE Generating Access Database 【发布时间】:2011-11-23 22:45:34 【问题描述】:

全部,

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

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

[逻辑]:没有发布我的很多转换和附加逻辑,这就是我正在尝试的:

    打开文件 x 读取文件 x 的第 0 行 jet->从步骤 2 导出的字符串执行 Create 语句 读取第 1 - n 行,创建制表符分隔的字符串并存储到数组中 使用 select * from tablename 打开记录集 对于数组中的每一项
      记录集->新增 根据标签拆分项目
        对于拆分中的每个项目
          rs->Fields->Item(pos)->Value = item_value
      记录集->更新

谢谢。

【问题讨论】:

20 分钟内加载了多少行?每行有多少列(字段)?输入文件总共有多大字节?您是否在加载期间创建索引? 【参考方案1】:

缓慢加载的一个问题是每次更新都进行提交。确保关闭自动提交并每 1000 行执行一次或其他。如果它不是一个巨大的负载,就不要这样做。另外,不要在加载过程中创建索引,以后再创建。

另外,我不确定 OLE 是否是执行此操作的最佳方式。我一直使用 DBI 和 Win32::ODBC 加载 Access db。速度很快。

根据请求,这里是示例加载程序,在 WinXP、Access 2003、ActiveState Perl 5.8.8 上每分钟执行大约 10 万条记录。

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;

【讨论】:

负载比我想要的访问数据库要大。我相信我正在加载大约 300k 行。你能把你的 dbi 代码的样本发给我吗?

以上是关于Perl Win32::OLE 生成访问数据库的主要内容,如果未能解决你的问题,请参考以下文章

win32client dispatch在python中失败,而win32 :: ole new在perl中成功运行for com dll

perl tk将界面输入的汉字不能输出到读取的EXCEL表格

(Perl)使用WMI获取系统信息

Perl 的 OLE 自动化基础知识

通过 win32ole 在 ruby​​ 中打开 powerpoint 演示文稿

可以用 Perl 编程语言做哪些神奇好玩的事情