Как подключиться к базе данных MS Access с помощью Perl?

У меня есть файл .accdb на моей локальной машине, и я пытаюсь подключиться к нему и прочитать некоторые данные из 3 таблиц в БД. Как установить соединение с помощью Perl?

До сих пор я собрал это для MS Access, но я получаю сообщения об ошибках, говорящих о том, что я не использую правильный драйвер. Любые идеи?

my $msaccess_dbh = DBI->connect(
    'dbi:ODBC:driver=microsoft access driver (*.accdb);' .
    'dbq=C:\path\to\database\databasefile.accdb'
);

Спасибо!

РЕДАКТИРОВАТЬ: Просто чтобы уточнить, у меня здесь нет реальных требований. Мне просто нужно сделать 2 или 3 выбора из этой базы данных MS Access, и тогда я закончу с этим. Так что любая помощь с подключением и выбором будет здорово. Спасибо еще раз.


person samandmoore    schedule 30.10.2009    source источник
comment
Есть ли какие-то требования для использования ODBC вместо OLEDB?   -  person David-W-Fenton    schedule 31.10.2009
comment
никаких требований, мне просто нужно выяснить, как получить некоторые данные из этой дурацкой базы данных MS Access.   -  person samandmoore    schedule 02.11.2009


Ответы (4)


Судя по вашей строке подключения, вы (а) используете Win32 и (б) подключаетесь к базе данных на своем локальном компьютере. Если я прав, зачем возиться с ODBC, если можно подключиться напрямую к Jet? См. ниже:

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

use Win32::OLE;

my $DBFile  = qw( X:\Path\To\Your\Database.mdb ); # 
#Choose appropriate version 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 = "DELETE * FROM Test_Table";
$DB->Execute($SQLquery, 128); #128=DBFailOnError
person heferav    schedule 31.10.2009
comment
Это говорит о том, что выберите соответствующую версию в строке комментариев. - person heferav; 02.11.2009
comment
Хорошо, похоже, это работает, теперь мой вопрос к вам: как мне сохранить выборку в массив, используя этот метод? - person samandmoore; 02.11.2009

Я предполагаю, что драйвер не соответствует тому, что у вас есть для DSN, или другая вещь, которая вызывает проблемы, это если вы смешиваете 64-битный Perl с 32-битным драйвером ODBC или 32-битный Perl с 64-битным драйвером. -битный драйвер. Настоящая проблема заключается в том сообщении об ошибке, оно ужасно расплывчато — вы думаете, может быть, они могли бы сказать вам, была ли проблема источником данных ИЛИ драйвером? В идеальном мире...

В любом случае, этот метод, который вы пытались использовать, работает, если ваш DSN правильный, и если ваш драйвер Perl и ODBC находится в одном семействе битов.

Ссылка на драйвер в DSN должна точно соответствовать тому, что указано на вкладке Инструменты администрирования > Источники данных (ODBC) > Драйверы. Мой указан как Драйвер Microsoft Access (.mdb, .accdb), поэтому он немного отличается от вашего. В Perl строка для подключения:

my $dbh = DBI->connect('dbi:ODBC:driver=Microsoft Access Driver (*.mdb, *.accdb);dbq=X:\Path\To\Your\Database.mdb')

Дополнительная информация о MS Access с Perl в Windows 7 находится здесь.

person Wick    schedule 14.12.2012

Вам нужны строки подключения.

person Fionnuala    schedule 30.10.2009
comment
DBI-›connect(dbi:ODBC:$connection_string); - person spoulson; 30.10.2009
comment
примерно так: мой $MSACCESS_DSN ='Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\path\to\database\databasefile.accdb;Persist Security Info=False;'; мой $msaccess_dbh = DBI-›connect(dbi:ODBC:$MSACCESS_DSN); Потому что это выдает ошибку о том, что имя источника данных не найдено и не указан драйвер по умолчанию. Извините, я немного новичок в MS db. - person samandmoore; 30.10.2009

Я успешно использовал строки подключения в этом формате в прошлом, но это было для старого формата *.mdb. Возможно, ваш драйвер ODBC не поддерживает более новый формат *.accdb в Access 2007.

person Michael Carman    schedule 30.10.2009
comment
Я преобразовал его в *.mdb, но он все равно отказывается работать. Возможно, мне придется искать другой драйвер. - person samandmoore; 30.10.2009