Perl & Microsoft SQL-Server 7.0 / dbi::ado
Thomas Mirke
- perl
Hallo,
die Zusammenarbeit zwischen Perl und einer Datenbank des MS SQL Servers scheint mit Hilfe des Moduls dbi::ado als Datenbanktreiber möglich zu sein.
Hat jemand damit Erfahrung gesammelt?
Wo kann man dieses wohl noch recht neue Modul bekommen?
Da unser Hoster (puretec) sich weigert, dieses Modul zu beschaffen und zu installieren: Ist es generell möglich Module auch als Bibliotheken bzw. mit require einzubinden? Müsste wohl gehen, habe aber damit keine Erfahrungen. Die generellen Nachteile von "require" sind mir bekannt.
Vielen Dank für sachdienliche Hinweise ...
Halihallo Thomas
Hat jemand damit Erfahrung gesammelt?
Nein.
Wo kann man dieses wohl noch recht neue Modul bekommen?
search.cpan.org und "DBI ADO" als Suchwörter.
http://search.cpan.org/~sgoeldner/DBD-ADO-2.88/lib/DBD/ADO.pm
http://search.cpan.org/~sgoeldner/DBD-ADO-2.88/
Da unser Hoster (puretec) sich weigert, dieses Modul zu beschaffen und zu installieren: Ist es generell möglich Module auch als Bibliotheken bzw. mit require einzubinden? Müsste wohl gehen, habe aber damit keine Erfahrungen. Die generellen Nachteile von "require" sind mir bekannt.
use funktioniert genauso wie require, nur dass gleich ein import
stattfindet. perldoc -f use
------------
Imports some semantics into the current package from the named
module, generally by aliasing certain subroutine or variable
names into your package. It is exactly equivalent to
BEGIN { require Module; import Module LIST; }
except that Module *must* be a bareword.
------------
und es kommt darauf an, ob das Modul ein C-Backend hat oder nicht.
Falls ja, musst du es kompilieren, falls nein, ist ein Import über
require/use Möglich.
Es gibt aber eine gute Alternative zu DBD-ADO:
Hat der Server Win32::OLE drauf, dann kannst du dieses verwenden und
über OLE ein ADO-Connection-Objekt instanziieren.
Zudem ist ggf. ein Providerwechsel zu empfehlen...
Viele Grüsse
Philipp
Hallo Philipp,
herzlichen Dank für Deine Hinweise!
Win32::OLE ist leider auch nicht verfügbar. Inzwischen meine ich herausgefunden zu haben, dass DBD::ADO (nicht DBI::ADO?) sowieso Win32::OLE voraussetzt, so dass ich es damit versuchen möchte.
Den Abschnitt "import Module LIST;" verstehe ich noch nicht. Was ist z.B. LIST konkret. "Module" ist, nehme ich an, der Pfad und Modulname, obwohl "bareword" wohl eher nahelegt, dass es sich um ein einzelnes Wort handeln sollte?
Der Vorteil von require ist ja gerade, dass man dort einen individuellen (von den Servereinstellungen abweichenden) Pfad zu einer Bibliothek angeben kann.
An perldoc komme ich leider nicht heran.
Wie man mit Perl über OLE ein ADO-Connection-Objekt instanziiert, ist mir leider auch nicht vertraut, kannst Du mir da einen Hinweis geben? Vielleicht auch auf (am besten deutschsprachige, gut übersetzte) Literatur dazu?
Halihallo Thomas
Win32::OLE ist leider auch nicht verfügbar. Inzwischen meine ich herausgefunden zu haben, dass DBD::ADO (nicht DBI::ADO?) sowieso Win32::OLE voraussetzt, so dass ich es damit versuchen möchte.
Naja, diese Abhängigkeit macht natürlich Sinn, wer programmiert schon
gerne zwei mal das gleiche :-)
Und ja, DBD ist der DataBaseDriver, DBI ist das DB-Interface. ADO
ist eben ein _D_river.
Den Abschnitt "import Module LIST;" verstehe ich noch nicht. Was ist z.B. LIST konkret. "Module" ist, nehme ich an, der Pfad und Modulname, obwohl "bareword" wohl eher nahelegt, dass es sich um ein einzelnes Wort handeln sollte?
"Wort", naja:
"import Module LIST" ist äquivalent mit "Module->import(LIST)".
Vielleicht ist so der Sinn besser ersichtlich. Use ist ein require
Der Vorteil von require ist ja gerade, dass man dort einen individuellen (von den Servereinstellungen abweichenden) Pfad zu einer Bibliothek angeben kann.
Hm... Von mir aus... Geht aber auch (meistens) bei use:
use lib qw(../lib);
use Module::Of::My::Lib; # welches sich in ../lib befindet.
An perldoc komme ich leider nicht heran.
http://www.perldoc.com gibts auch online :-)
Wie man mit Perl über OLE ein ADO-Connection-Objekt instanziiert, ist mir leider auch nicht vertraut, kannst Du mir da einen Hinweis geben? Vielleicht auch auf (am besten deutschsprachige, gut übersetzte) Literatur dazu?
Da hab ich grad nix gescheites anzubieten, denn wenn ich es brauche
findet man alles sehr schnell im Internet. Es gibt zahlreiche
Beispiele (meistens für VBScript, aber das Objektmodell bleibt
dasselbe). Über MSDN von M$ findest auch du auch die entsprechenden
InterfaceDescriptions.
Kleines BSP zur Orientierung, das noch irgendwo bei mir rumschwirrte:
-----
use Win32::OLE;
use Win32::ADO qw/CheckDBErrors/;
$ado = Win32::OLE->new("ADODB.Connection") or die "no create!";
if (Win32::OLE->LastError != 0) { die Win32::OLE->LastError; }
$ado->Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=c:\db_name.mdb");
if (Win32::OLE->LastError != 0) { die Win32::OLE->LastError; }
my $SQL = "SELECT * FROM test_table";
$rs = $ado->Execute("$SQL");
if (Win32::OLE->LastError != 0) { die Win32::OLE->LastError; }
$rs->MoveFirst;
if (Win32::OLE->LastError != 0) { die Win32::OLE->LastError; }
print $rs->item("Name")."\n";
-----------
So, keine Ahnung, ob dies funktioniert, ich habe es nicht wieder
getestet. Du musst natürlich bei $ado->Open() den MS SQL Connection
String übergeben, mein Beispiel war für eine Access-DB.
Viele Grüsse
Philipp
Hallo Philipp,
geile Auskünfte, vielen Dank!
Jetzt bin ich auf der richtigen Spur.
(:-))