2014-02-10 3 views
3

Я пытаюсь извлечь данные из таблицы в доступе. КодПодключить perl к ms доступ

#!/usr/bin/perl 
use strict; 
use warnings; 
use DBI; 
my $DBFile = qw(C:test\INSTRUCTIONS.mdb); 
my $dbh = DBI->connect("dbi:ODBC:driver=microsoft access driver (*.mdb);dbq=$DBFile",'','') or die("cannot connect to DB"); 
my $SQLquery = "select * FROM IndemDate"; 
$dbh->Execute($SQLquery); 

Это ошибка я Получать

DBI connect('driver=microsoft access driver (*.mdb);dbq=C:test\INSTRUCTIONS.mdb','',...) failed: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (SQL-IM002) at C:/Test/connectaccess.pl line 9. 
cannot connect to DB at C:/Test/connectaccess.pl line 9. 

может кто-то поможет мне исправить мою ошибку. Есть ли драйвер, который я пропустил для установки.

+0

попробуйте использовать 'мой $ DBFile = 'C: /test/INSTRUCTIONS.mdb'; умереть «проблемы с файлом пути», если не -e $ DBFile; «возможно, есть проблемы с передачей этого аргумента .. вы можете использовать эти строки, чтобы проверить, похоже ли это, как я писал. –

+0

Вы пытались настроить соединение ODBC через панель управления, чтобы убедиться, что все в порядке? –

+0

@FilippoLauria это не сработало так или нет – Programmer

ответ

3

Как указано в комментариях к вопросу, сценарий Perl изначально был запущен как 64- битный процесс. Поэтому более старый Microsoft «Jet» ODBC драйвер

Microsoft Access Driver (*.mdb) 

не был доступен. Только более 32-битные процессы могут использовать старый драйвер Jet. Если вы должны запустить ваш Perl-скрипт как 64-разрядный процесс, вам придется загрузить и установить 64-разрядную версию нового Microsoft Access Database Engine (aka «ACE») с here, а затем использовать имя драйвера

Microsoft Access Driver (*.mdb, *.accdb) 

Или вы можете запустить свой Perl-скрипт как 32-разрядный процесс и использовать старый драйвер Jet.

Edit повторно: комментарий

Поскольку у вас есть 32-битный доступ 2007 вы установили уже 32-битную версию драйвера ACE на машине с. Это эффективно исключает возможность установки 64-разрядной версии ACE-драйвера, потому что 64-разрядный установщик ACE будет прерван, если обнаружит 32-разрядные компоненты Office на машине. (Существует, по-видимому способ, чтобы заставить вторую установку, но сообщается, сломать офис в некоторых обстоятельствах и, безусловно, не поддерживается.)

Так что ваши варианты могут быть пересмотрены:

  1. Run Perl-скрипт как 32-разрядный процесс или

  2. Удалите 32-разрядный Access 2007 и установите 64-разрядную версию Access, затем запустите скрипт Perl в качестве 64-разрядного процесса с использованием 64-разрядного ACE-драйвера ,

+0

, но я использую ms access 2007 – Programmer

+0

@Programmer Это 32-разрядный Access 2007? (Я честно не помню, была ли 64-разрядная версия Access 2007.) –

+0

ms доступ 32-разрядный - это то, что я запускаю на 64-битной ОС – Programmer

0

Попробуйте использовать Jet:

#!/usr/bin/perl -w 
use strict; 
use warnings; 

use Win32::OLE; 

my $DBFile = qw(C:\test\INSTRUCTIONS.mdb); 

# choose the appropriate versione of Jet for your system 
my $Jet = Win32::OLE->CreateObject('DAO.DBEngine.36') or die "Can't create Jet database engine."; 

my $DB = $Jet->OpenDatabase($DBFile); 
my $SQLquery = "select * FROM IndemDate"; 
$DB->Execute($SQLquery, 128); #128=DBFailOnError 

[источник: here, также имеют вид here]

+0

Ошибка 'Win32 :: OLE (0.1709) 0x80040154:« Класс не зарегистрирован »в строке C: /test/connectaccess.pl 10. Невозможно создать движок базы данных Jet. в строке C: /test/connectaccess.pl 10. «Это ошибка, я получаю – Programmer

0

Для выполнения скрипта в качестве 32-разрядного процесса (в моем случае, 32-битный Strawberry Perl), следующий код работает для меня:

#!perl 
use strict; 
use warnings; 
use DBI; 
print 'bits: ' . (8 * (length pack 'P', -1)) . "\n\n"; 
my $DBFile = q(C:\Users\Public\mdbTest.mdb); 
my $dbh = DBI->connect("dbi:ODBC:Driver={Microsoft Access Driver (*.mdb)};DBQ=$DBFile",'','') or die("cannot connect to DB"); 
my $SQLquery = "SELECT * FROM Members"; 
my $sth = $dbh->prepare($SQLquery); 
my $rc = $sth->execute; 
while (my $href = $sth->fetchrow_hashref) { 
    print "memberID: " . $$href{"memberID"} . "\n"; 
    print "memberName: " . $$href{"memberName"} . "\n"; 
    print "\n"; 
} 
+0

Нет, я все еще получаю ошибку 'DBI connect ('Driver = {Microsoft Access Driver (* .mdb)}; DBQ = C: \ INSTRUCTIONS.mdb ',' ', ...) не удалось: [Microsoft] [диспетчер драйверов ODBC] Имя источника данных не найдено, а драйвер по умолчанию не указан (SQL-IM002) в строке C: /test/connectaccess.pl. не может подключиться к БД при C: /test/connectaccess.pl строке 6. ' – Programmer

+0

Я использую активный perl – Programmer

+0

@Programmer Попробуйте добавить инструкцию' print 'bits:'. (8 * (пакет длины 'P', -1)). "\ n \ n"; 'рядом с началом вашего скрипта. (См. Пересмотренный код, выше.) Что он печатает? –

Смежные вопросы