Hello Martin, Martin J. Evans a écrit : >>>>> I'm trying to simply do a SELECT from an ODBC source. >>>>> It works perfectly in PHP but not in perl ! >>>>> Therefore there is no problem at source or at ODBC level, it seems to >>>>> reside at perl/DBI level... >>>>> >>>>> What I do : >>>>> >>>>>> use DBI; >>>>>> $dbh = DBI->connect('dbi:ODBC:' . $dsnname, $dbuser, $dbpwd) or... >>>>>> $sth = $dbh->prepare($sql) or die... >>>>>> $sth->execute or die... >>>>>> do { >>>>>> my @row; >>>>>> my $line=1; >>>>>> # fetch each row in array >>>>>> while (@row = $sth->fetchrow_array()) >>>>>> { >>>>>> print ($line + 1); >>>>>> print ". "; >>>>>> # print each field in a row >>>>>> for ($i=0;$i<$#row;$i++) >>>>>> { >>>>>> print $row[$i] >>>>>> }; >>>>>> print "\n"; >>>>>> $line++; >>>>>> } >>>>>> # see if there's more records to show >>>>>> } while ($sth->{odbc_more_results}); >>>>>> >>>>> But even if my script is working, most of the time (not always but 80% >>>>> of time ???) I get this error : >>>>> >>>>> DBD::ODBC::st fetchrow_array failed: [unixODBC][IBM][System i Access >>>>> ODBC Driver]Column 1: CWB0111 - A buffer passed to a system call is >>>>> too >>>>> small to hold return data (SQL-22018) [state was 22018 now 01004] >>>>> >>>>> [unixODBC][IBM][System i Access ODBC Driver]String data right >>>>> truncation. (SQL-01004) at ./odbcdemo-perl.pl line n. >>>>> >>>> I must add an important point, I received 47 rows out of the 126 >>>> expected >>>> >>>> >>>>> I'm not an ODBC expert, not a DBI expert, therefore I'm maybe >>>>> forgetting >>>>> something important to be done, but I don't find anything on the web >>>>> that helped me... >>>>> >>>>> Last idea, could it be due to UTF8, which would create difference in >>>>> string sizes ? >>>>> >>>>> I found a similar bug in PHP : >>>>> http://www-01.ibm.com/support/docview.wss?uid=nas1ac5658703ae5a78b862575440052cbda >>>>> >>>>> And a thread about my problem but without solution : >>>>> http://www.ibm.com/developerworks/forums/thread.jspa?threadID=185874&tstart=45 >>>>> >>>>> But I don't understand DBI enough to understand what I should do ? >>>> >>> Take a look at the DBI attribute LongReadLen. >> >> Yes I already saw people saying this, but I don't understand where to >> look and what to look for... (Already searched a lot for this >> "LongReadLen" ;-) >> > perldoc DBI then search for LongReadLen or go to > http://search.cpan.org/~timb/DBI-1.609/DBI.pm where you'll find an > online version. > Basically, you need to set LongTruncOk > http://search.cpan.org/~timb/DBI-1.609/DBI.pm#LongTruncOk_(boolean,_inherited) > to say you don't mind column data being truncated or you need to set > LongReadLen > http://search.cpan.org/~timb/DBI-1.609/DBI.pm#LongReadLen_(unsigned_integer,_inherited) > to a value bigger than your largest column data. > You can set these attributes on the connection handle ($dbh in your > example) or on a per statement case ($sth in your example after you call > prepare but before execute).
Ok, now I understood... Thanks a lot for your explanations, it was like chinese to me, before... (Way of speaking, as I understand chinese, but that's OT ;-)) a) First I tried LongTruncOk, I added this line to my perl script : $dbh->{LongTruncOk}=true; And there was no error anymore. Good, that's a good start... But the problem is that I do care about data being truncated ;-) b) Therefore I wanted to try LongReadLen... In the doc it is said that default value is 80, therefore I tried many values, but it didn't solve the problem. Strange because my biggest field is a varchar(30)... I tried : $dbh->{LongReadLen}=2000; And got : DBD::ODBC::st fetchrow_array failed: [unixODBC][IBM][System i Access ODBC Driver]Column 1: CWB0111 - A buffer passed to a system call is too small to hold return data (SQL-22018) [state was 22018 now 01004] [unixODBC][IBM][System i Access ODBC Driver]String data right truncation. (SQL-01004) at ./odbcdemo-perl3.pl line 39. Do you understand what could be the problem ? Denis