2009-10-30 3 views
4

У меня есть файл .accdb на моем локальном компьютере, и я пытаюсь подключиться к нему и прочитать некоторые данные из 3 таблиц в БД. Как установить соединение с помощью Perl?Как подключиться к базе данных MS Access с помощью 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, а затем я буду с этим работать. Поэтому любая помощь при подключении и выборе будет отличной. Еще раз спасибо.

+0

'' dbi: ADO: .... 'может быть? –

+0

Есть ли какое-то требование для использования ODBC в отличие от OLEDB? –

+0

Нет требований, мне просто нужно выяснить, как получить некоторые данные из этой глупой базы данных MS Access. – samandmoore

ответ

4

На основании вашей строки подключения это выглядит так: (a) на Win32 и (b) подключение к базе данных на вашем локальном машина. Если я прав, зачем беспокоиться о 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 
+0

DAO версия 3.6 не может читать ACCDB. –

+0

Это означает, что в строке комментариев указано «выбрать соответствующую версию». – heferav

+0

Хорошо, похоже, это сработало, теперь мой вопрос для вас - как сохранить выделение в массиве с помощью этого метода? – samandmoore

2

Вам нужно connection strings

+0

DBI-> connect ("dbi: ODBC: $ connection_string"); – spoulson

+0

так что-то вроде этого: my $ MSACCESS_DSN = 'Provider = Microsoft.ACE.OLEDB.12.0; Источник данных = C: \ path \ to \ database \ databasefile.accdb; Persist Security Info = False;'; my $ msaccess_dbh = DBI-> connect ("dbi: ODBC: $ MSACCESS_DSN"); Потому что это ошибка, говорящая о том, что имя источника данных не найдено, а драйвер по умолчанию не указан. Извините, я немного MS db noob. – samandmoore

1

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

+0

Я преобразовал его в * .mdb, но он по-прежнему отказывается работать. Возможно, мне придется искать другой драйвер. – samandmoore

3

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

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

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

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

Более подробную информацию о MS Access with Perl on Windows 7 is here.

+1

Отличный вопрос о проблемах с 32 и 64 бит! –

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