Perl Win32::OLE生成Access数据库

Perl Win32::OLE生成Access数据库,perl,ms-access,Perl,Ms Access,全部, [说明]:我正在读取平面文件列表,并生成和加载access数据库。Windows XP、Perl 5.8.8,并且无法访问默认安装之外的其他模块 [问题]:绩效,绩效,绩效。加载所有数据大约需要20分钟。我假设有更好的方法来加载数据,而不是添加新的和更新 [Logic]:在不发布大量转换和附加逻辑的情况下,我正在尝试: 打开文件x 读取文件x的第0行 jet->从步骤2中导出的字符串执行Create语句 读取第1-n行,创建制表符分隔的字符串并存储到数组中 使用select*from t

全部,

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

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

[Logic]:在不发布大量转换和附加逻辑的情况下,我正在尝试:

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

  • 谢谢。

    慢加载中的一个问题是在每次更新时进行提交。确保“自动提交”处于禁用状态,并每1000行执行一次或其他操作。如果这不是一个巨大的负担,就不要做。另外,不要在加载期间创建索引,而是在加载之后创建索引

    另外,我不确定OLE是否是最好的方法。我一直使用DBI和Win32::ODBC加载Access数据库。进展很快

    根据请求,这里是示例加载程序,在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;
    
    使用严格;
    使用警告;
    使用Win32::ODBC;
    $| = 1;
    my$dsn=“LinkManagerTest”;
    my$db=新Win32::ODBC($dsn)
    或“连接到数据库$dsn失败:”。Win32::ODBC::Error();
    我的$rows\u added=0;
    我的$error\u代码;
    而(){
    咀嚼;
    打印标准“.”,除非$.%100;
    打印标准“$。\n”,除非$.%5000;
    我的($source、$source\u link、$url、$site\u name)=拆分/\t/;
    我的$insert=qq{
    插入链接(
    网址,
    站点名称,
    来源:,
    源链接
    )
    价值观(
    “$url”,
    “$site_name”,
    “$source”,
    “$source_link”
    )
    };
    $error\u code=$db->Sql($insert);
    如果($error\u code){
    打印“\nSQL更新在第$行失败,错误代码为$error\U code\n”;
    打印“SQL语句:\n$insert\n\n”;
    打印“错误:\n”。$db->Error()。\n\n”;
    }
    否则{
    $rows_已添加++;
    }
    $db->Transact('SQL_COMMIT'),除非$.%1000;
    }
    $db->Transact('SQL_COMMIT');
    $db->Close();
    打印“\n”;
    打印“行读取:$。\n”;
    打印“添加的行:$Rows\u Added\n”;
    出口0;
    
    在20分钟内加载了多少行?每行有多少列(字段)?输入文件总共有多大字节?您是否在加载期间创建索引?加载比我希望的access数据库的加载大。。我相信我正在加载大约30万行。你能给我一个你的dbi代码的样本吗?