ODBC and long text fields
- From: larry@xxxxxxxxxxxxxxxx (Larry Garfield)
- Date: Sun, 7 Jan 2007 20:06:55 -0600
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
.
- Follow-Ups:
- Re: [PHP] ODBC and long text fields
- From: Jochem Maas
- Re: [PHP] ODBC and long text fields
- Prev by Date: Re: [PHP] Windows directory listings
- Next by Date: Re: Syntax Error
- Previous by thread: Syntax Error
- Next by thread: Re: [PHP] ODBC and long text fields
- Index(es):
Relevant Pages
|