Thomas Mirke: Perl & Microsoft SQL-Server 7.0 / dbi::ado

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 ...

  1. 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

    1. 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?

      1. 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

        • eben diesen "Methodenaufruf", welche z.B. gewisse Symbole in das
          aktuelle Package von dem "geused" wird exportiert werden. LIST
          beschreibt hierbei genau jene Liste an Symbolen oder -Gruppen, die
          Exportiert werden müssen. "use test qw(... ... ...)" das in qw() ist
          eben diese LIST.

        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

        1. Hallo Philipp,

          geile Auskünfte, vielen Dank!
          Jetzt bin ich auf der richtigen Spur.
          (:-))