2016-06-16 20 views
1

Ich benutze Perl, um durch eine große Anzahl von Rich Text "Dateien" (gespeichert als Ntext - ein Datentyp, der ziemlich a ist Mystery für mich), die in einer SQL Server-Datenbank leben, die ich ziemlich neu bin, nachdem ich vorher nur mit Oracle gearbeitet habe. Allerdings bekomme ich nur die ersten ~ 40 Zeichen aus jeder Datei zurück. Jede Datei beginnt etwas wie folgt aus:Versuchen, großes Textfeld aus Datenbank mit Perl DBI auszuwählen, und es wählt nur das erste Bit

{\rtf1\sste17000\ansi\deflang1033\ftnbj\uc1\deff0 {\fonttbl{\f0 \fswiss Arial;} etc. 

Aber wenn ich aus Perl bin Auswahl, schneiden sie wie folgt aus:

{\rtf1\sste17000\ansi\deflang1033\ftnbj 

Hier ist der Code habe ich jetzt (select-Anweisung offensichtlich vereinfacht der Kürze halber):

my $dbh = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=$server;UID=$user;PWD=$password") 
    or die "Can't connect to server: $DBI::errstr"; 

my $sth = $dbh->prepare("select note_txt from database") 
    or die "Couldn't prepare statement: " . $dbh->errstr; 
my @data; 

$sth->execute() 
    or die "Couldn't execute statement: " . $sth->errstr; 

$sth->{'LongTruncOk'} = 1; 
$sth->{'LongReadLen'} = 2000; 
while (@data = $sth->fetchrow_array()) { 
    my $note = $data[0]; 
    parse_note($note); 
} 

Warum es mir nur geben die ersten ~ 40 Zeichen, und wie kann ich den gesamten Text raus?

Danke!

+3

Nach dem [DBI docs] (https://metacpan.org/pod/DBI#LongReadLen), „Ändern Sie den Wert von' LongReadLen' für ein Statement-Handle, nachdem es 'worden typischerweise prepare''d haben kein Effekt, daher ist es üblich, 'LongReadLen' auf dem' $ dbh' zu setzen, bevor 'prepare' aufgerufen wird." Behebt das dein Problem? – ThisSuitIsBlackNot

+0

Das scheint den Trick geschafft zu haben! Ich danke dir sehr! – Cassie

Antwort

1

Ich hatte ein ähnliches Problem mit DBI :: ODBC und ich würde den Code auf der Datenbank-Handle ändern, nicht die Anweisung Handle. Verwenden Sie den Code wäre es jetzt wie eine solche aussehen (bemerkte der LongReadLen wurde im Code nach oben und ich schlage vor, mit der Datenbank $dbh behandeln, nicht die Anweisung behandeln $sth):

my $dbh = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=$server;UID=$user;PWD=$password") 
    or die "Can't connect to server: $DBI::errstr"; 

$dbh->{LongTruncOk} = 1; 
$dbh->{LongReadLen} = 2000; 

my $sth = $dbh->prepare("select note_txt from database") 
    or die "Couldn't prepare statement: " . $dbh->errstr; 
my @data; 

$sth->execute() 
    or die "Couldn't execute statement: " . $sth->errstr; 

while (@data = $sth->fetchrow_array()) { 
    my $note = $data[0]; 
    parse_note($note); 
} 

Sie auch die anpassen möchten $dbh->{'LongReadLen'} = 2000; höher sein. Jede Situation ist natürlich anders, aber in meinem Fall habe ich 16K dh $dbh->{'LongReadLen'} = 16384;

Hier ist auch ein wenig Code-Stub mit Kommentaren aus dem Buch das Perl DBI Programmierung:

$dbh->{LongReadLen} = 512 * 1024; ### We are interested in the first 512 KB of data 
$dbh->{LongTruncOk} = 1; ### We're happy to truncate any excess 

HINWEIS: I glaube auch nicht, dass die einfachen Anführungsstriche notwendig sind. So $dbh->{'LongReadLen'} wird $dbh->{LongReadLen}.
Auch, wie vom Benutzer @ ThisSuitIsBlackNot in den Kommentaren erwähnt, finden Sie in der DBI docs für weitere Erläuterungen und Informationen.

+0

Schöne Antwort. Sie können auch erwähnen, dass dieses Verhalten in den [DBI-Dokumenten] dokumentiert ist (https://metacpan.org/pod/DBI#LongReadLen). – ThisSuitIsBlackNot

+0

werde ich. Ich füge das meiner Antwort hinzu. Danke. – tale852150