Schrift
[thread]3469[/thread]

Memo-Fields und MS Access



<< >> 10 Einträge, 1 Seite
Gast Gast
 2004-06-15 16:28
#32279 #32279
Das einlesen von Memo-Fields aus einer MS Access Datenbank macht mir schon seit Ewigkeiten Probleme weil der Content einfach abgeschnitten wird wenn nicht beim Lesevorgang die Größe des zu lesenden Content bekannt ist.
Gut - ich ermittle die Bytes bereits vor dem Schreibvorgang und habe dann eine Feld in der Tabelle um diesen Wert dort zu speichern.
Das bedeutet aber daß ich vor jedem 'eigentlichen' Lesezugriff, zunächst eine Datenbankverbindung herstellen und von dort den max. Wert der zu übertragenden Bytes ermitteln muß - das ist teuer.
Die max. Werte in einen Hash zu hängen und den Hash in eine FlatFile-Datei zu speichern wäre zwar nicht so teuer aber doch ziemlich umständlich.

Hat da jemand eine Idee ??
pktm
 2004-06-15 21:09
#32280 #32280
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hash in das Programm mit aufnehmen, ist aber alles andere als praktisch.
http://www.intergastro-service.de (mein erstes CMS :) )
Heromaster
 2004-06-15 22:43
#32281 #32281
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Hmm, wenn Du Win32::OLE nutzt, müsstest Du mithilfe des ADO-Objekts die Größe des Memofelds herausbekommen. Ich schau mal im Objektkatalog nach, vielleicht findet sich ja was geeignetes.

edit: Ansonsten probiers mal damit, das sollte unabhängig von der Datensatzgröße sein:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Win32::OLE;
$conn = Win32::OLE->new("ADODB.Connection");
$conn->Open("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\auftrag.mdb;Mode=Share Deny None");
$RS = $conn->Execute("SELECT memo FROM table");
if (!$RS) {
$Errors = $conn->Errors();
die "Errors:\n", map { "$_->{Description}\n" } keys %$Errors;
}

while ( !$RS->EOF ) {
my $memo = $RS->Fields('memo')->Value;
print "$memo\n";
$RS->MoveNext();
}
$RS->Close();
$conn->Close();
\n\n

<!--EDIT|Heromaster|1087325629-->
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
Gast Gast
 2004-06-16 15:54
#32282 #32282
[quote=Heromaster,15.06.2004, 20:43]Hmm, wenn Du Win32::OLE nutzt, müsstest Du mithilfe des ADO-Objekts die Größe des Memofelds herausbekommen. Ich schau mal im Objektkatalog nach, vielleicht findet sich ja was geeignetes.

edit: Ansonsten probiers mal damit, das sollte unabhängig von der Datensatzgröße sein:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Win32::OLE;
$conn = Win32::OLE->new("ADODB.Connection");
$conn->Open("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\auftrag.mdb;Mode=Share Deny None");
$RS = $conn->Execute("SELECT memo FROM table");
if (!$RS) {
   $Errors = $conn->Errors();
   die "Errors:\n", map { "$_->{Description}\n" } keys %$Errors;
}

while ( !$RS->EOF ) {
   my $memo = $RS->Fields('memo')->Value;
   print "$memo\n";
   $RS->MoveNext();
}
$RS->Close();
$conn->Close();
[/quote]
Im Grunde genommen brauche ich Win32::WhatEver nicht um eine Datenbankverbindung zu Access aufzubauen.
Will sagen:
Ich verwende die Module Win32::XXXX nicht weil dann der ISP des Users für jede Datenbank (des Users) eine DSN einrichten muß - und das ist ganz schön lästig.
DBI kann den ganzen ODBC/OLE-Kram einfach umgehen und macht damit den DB-Zugriff sogar deutlich schneller.
Heromaster
 2004-06-16 16:16
#32283 #32283
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
[quote=Dieter,16.06.2004, 13:54]Im Grunde genommen brauche ich Win32::WhatEver nicht um eine Datenbankverbindung zu Access aufzubauen.
Will sagen:
Ich verwende die Module Win32::XXXX nicht weil dann der ISP des Users für jede Datenbank (des Users) eine DSN einrichten muß - und das ist ganz schön lästig.
DBI kann den ganzen ODBC/OLE-Kram einfach umgehen und macht damit den DB-Zugriff sogar deutlich schneller.[/quote]
Nein, das ist falsch. Wenn Du Verbindungen zu Access-Datenverbindungen aufbauen möchtest, musst Du nicht eine eigene DSN eintragen (siehe mein Code).
Möglich ist es, das DBI schneller ist als Win32::OLE, was ich jedoch stark bezweifle. Und Du sagst ja selbst, das Deine Lösung ziemlich teuer in der Performance ist, also kannst Du auch gleich zu Win32::OLE greifen ;)
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
Gast Gast
 2004-06-16 17:44
#32284 #32284
Falsch ist immer ein sehr hartes Wort ;)
Danke für Deine Lösung - werde mal beides ausprobieren und benchmarken - bin gespannt was dabei rauskommt ...
Strat
 2004-06-17 01:23
#32285 #32285
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
du kannst aus dem script heraus eine DSN einrichten, wenn du Win32::ODBC verwendest. (fuer System-DSN brauchst du aber Admin-Rechte, aber User-DSN geht auch so). Wie das geht, steht auf meiner HP unter Perl -> Tips&Tricks -> Perl-Enhanced -> Win32::ODBC
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2004-06-17 13:23
#32286 #32286
@strat

Bisher habe ich das immer so gemacht
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub msa_connect {
   my $DSN = 'driver=Microsoft Access Driver (*.mdb);dbq=';
   my $dbh = DBI->connect(
       "dbi:ODBC:$DSN$config{'db_name'}",
       $config{'db_user'},
       $config{'db_pwd'},
           {
               PrintError    => 0,
               RaiseError    => 1,
               LongReadLen    => $config{'LongReadLen'},
               LongTruncOk    => 0
           }
   ) or oops($DBI::errstr);
   
   return $dbh;
}

und damit die Verwendung von Win32::ODBC vermieden.

Im Moment kann ich den Unterschied zu Deinem Code noch nicht so recht erkennen - kleine Erläuterung?
Heromaster
 2004-06-17 20:43
#32287 #32287
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Quote
Falsch ist immer ein sehr hartes Wort

Sry, ich nehme das zurück :) Wollte Dich damit nicht angreifen.
Quote
Danke für Deine Lösung - werde mal beides ausprobieren und benchmarken - bin gespannt was dabei rauskommt ...

Auf diese bin ich auch gespannt.

Im Übrigen habe ich den Objektkatalog von ADO mal durchforstet. Es scheint demnach keine direkte Methode zu geben, die Größe eines Datensatzes herauszubekommen.
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
Gast Gast
 2004-06-17 20:53
#32288 #32288
[quote=Heromaster,17.06.2004, 18:43]
Im Übrigen habe ich den Objektkatalog von ADO mal durchforstet. Es scheint demnach keine direkte Methode zu geben, die Größe eines Datensatzes herauszubekommen.[/quote]
Yepp - die leidvolle Erfahrung habe ich bereits so vor 3 oder 4 Jahren machen müssen (und bin deshalb zum Speichern der Größe des jeweils größten Feldes des aktuellen Datensatz übergegangen).

P.S.
Unter MySQL ist das (jetzt) alles kein Problem mehr ...
<< >> 10 Einträge, 1 Seite



View all threads created 2004-06-15 16:28.