ODBC and long text fields

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all.  I've a question regarding PHP's ODBC support.

Here's the situation: 

We've a PHP app that uses ODBC to talk to a MS SQL server.  Its original home 
was on a server that used the OpenLink ODBC driver, which was a POS, so we 
build an abstraction wrapper around the subset of PHP's ODBC functions that 
we were able to use to make it usable.  The internal code for a query is 
built on odbc_exec, odbc_fetch_row, and odbc_result.  The main interesting 
part is that the original driver didn't allow for named results, so instead 
we have a small string parser that reads the incoming SQL query, extracts the 
field names, and then uses that to map the numeric result indexes to their 
field name.  Kinda clunky, but worked well and used only a minimal ODBC 
footprint.  

That worked fine on their old system.  However, the client then moved from a 
Windows IIS server to Apache and PHP 5.1.6 on a Linux box, but still talking 
to an MS SQL server on a Windows box.  We migrated our test environment to 
the same; Linux/Apache/PHP 5.1 talking to MS SQL on a Windows box over the 
network.  Our system uses the unix_ODBC and freetds stack for ODBC 
connectivity, and that works fine.

On the client's system, it works fine except for a few odd cases.  
Specifically, on a few queries that pull data from large text fields the 
query may hang.  It seems to reliably hang on certain records only, and only 
after those records have been edited.  It seems that when updating a record, 
there is a small chance of something happening to that record and it then not 
working thereafter.  A PHP test script run from the command line freezes, 
while the same query run directly on the SQL server returns almost instantly.

The client has been in contact with their ODBC driver vendor (they're using a 
commercial driver), and the vendor's response is that we're not using ODBC 
correctly.  Specifically, they say:

-----
I followed the ODBC calls in your odbc trace file and I got error 
"Invalid Descriptor Index" on SQLGetData as well. I know we normally 
don't handle the retrieval of large dataset like Text using SQLGetData 
as your application is doing. I'm in the research of whether the way 
your application does is valid or not.
-----

They then followed up with:

-----
We have done some research on this issue. We realized that your 
application is binding all the columns for the resultset and then use 
SQLGetData. This is not the correct way to do. You can either use bind 
column for result set and then print out the data in the bound buffer, 
or use SQLGetData to get the unbound resultset.
-----

They then include some sample code that is all in C.

Now I'll be honest and say I don't quite follow what they're talking about. I 
do not claim to be an ODBC guru, but SQLGetData is a lower-level operation, 
SQL level or C level I don't know, but not something that happens in PHP code 
as far as I am aware.  Are they saying there's a bug in PHP's 
odbc_fetch_row()?  Or is it a bug in their driver if it can't handle whatever 
it is odbc_fetch_row() does internally?  Or should we be using odbc_result() 
instead of odbc_fetch_row() if we're dealing with a text field rather than a 
varchar or int?  

I am confused, and would appreciate assistance in becoming less confused. :-)  
Thanks.

-- 
Larry Garfield			AIM: LOLG42
larry@xxxxxxxxxxxxxxxx		ICQ: 6817012

"If nature has made any one thing less susceptible than all others of 
exclusive property, it is the action of the thinking power called an idea, 
which an individual may exclusively possess as long as he keeps it to 
himself; but the moment it is divulged, it forces itself into the possession 
of every one, and the receiver cannot dispossess himself of it."  -- Thomas 
Jefferson

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux