[freetds] SQL_NO_DATA or SQL_SUCCESS
James K. Lowden
jklowden at freetds.org
Wed Feb 27 10:49:28 EST 2008
ZIGLIO, Frediano, VF-IT wrote:
> MS driver NEVER
> > > returns SQL_NO_DATA !!!
...
>
> Mmmm... as said if nobody complains I would commit... so I complain :)
>
> Yes, it seems that DELETE/UPDATE with no rows produce SQL_NO_DATA!!
> However I must say that as documented only DELETE/UPDATE with no rows
> should return SQL_NO_DATA. The situaction is complicated by the fact
> that only mssql (no Sybase) return proper informations to detect
> UPDATE/DELETE execution!
I have been trying to test this for you with the Sybase ODBC driver on my
OS X box. Last night I built FreeTDS on it for the first time, but didn't
get to testing anything.
http://msdn2.microsoft.com/en-us/library/ms715424(VS.85).aspx
I'm sure you've read the above confusing page more than once. It says
that whether SQLExecute returns SQL_NO_DATA or SQL_SUCCESS depends on:
1. Whether the *application* is 2.x or 3.x.
2. Whether the "searched update or delete" was part of a batch.
3. Whether any rows were affected.
According to the documentation, then, SQLExecute returns SQL_NO_DATA only
if
1. a "searched update or delete" is not part of a batch -- or, I presume,
a stored procedure -- and
2. is issued by a 3.x application, and
3. affected zero rows.
(I do not know what a "searched update" is. I guess it means one with a
WHERE clause. If I issue "UPDATE tablename SET columname = 0" on a table
with zero rows, it affects zero rows. What should the driver return
then?)
The simplest choice: always return SQL_SUCCESS from SQLExecute and reserve
SQL_NO_DATA for SQLFetch.
The "right" choice (apparently): Return SQL_NO_DATA from SQLExecute *only*
for a 3.x application and *only* if you get back a DONE packet (0xFD) with
rowcount == 0 immediately after issuing the query.
How much simpler could it be? ;-)
--jkl
More information about the FreeTDS
mailing list