Denis BUCHER wrote:
> 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
> 
> 

Could you send the following to me (not the list as the log will
probably be too long and removed):

version of unixODBC you are using - odbcinst -j tells you this.

verion and name of the ODBC driver you are using

edit /etc/odbcinst.ini (or wherever your odbcinst.ini is) and add:

[ODBC]
Trace           = yes
TraceFile               = /tmp/unixodbc.log

to the top of it.

Edit your perl script and add the following to the top of it:

use DBD::ODBC;
DBI->trace(DBD::ODBC->parse_trace_flags('odbcconnection|odbcunicode'));

Now rerun your script with something like this:

export DBI_TRACE=15=x.log
./myscript.pl

Send me /tmp/unixodbc.log and x.log.

I'll see what I can see :-)

Martin
-- 
Martin J. Evans
Easysoft Limited
http://www.easysoft.com

Reply via email to