ID:               13838
 Updated by:       [EMAIL PROTECTED]
 Reported By:      f dot glasner at feldmann-mg dot com
-Status:           Analyzed
+Status:           Assigned
-Bug Type:         ODBC related
+Bug Type:         Feature/Change Request
 Operating System: WinNT4 SP5
 PHP Version:      4.3.0
-Assigned To:      
+Assigned To:      kalowsky


Previous Comments:
------------------------------------------------------------------------

[2003-01-06 12:22:19] [EMAIL PROTECTED]

This is true for all versions of PHP really.  The ODBC env needs to be
delt with differently for this to work.  I've been working on a fix for
this for awhile.  

------------------------------------------------------------------------

[2001-10-26 10:55:48] f dot glasner at feldmann-mg dot com

I am using PHP 4.0.6 on WinNT4 SP5. The database is
MSSQL 7.0.

With the default ODBC statement concurrency option set
by PHP/ODBC some queries are not executed by SQL Server.

  $conn = odbc_connect("MyDSN", "user", "pass");
  odbc_exec($conn, "SELECT * FROM test1 WITH(UPDLOCK HOLDLOCK) WHERE
ID=1");

results in this error:

[Microsoft][ODBC SQL Server Driver][SQL Server]Cannot specify UPDLOCK
or TABLOCKX with READ ONLY or INSENSITIVE cursors.

Workaround:
Manually set a default ODBC statement option that
results in a cursor that is not read only:

  $conn = odbc_connect("MyDSN", "user", "pass");
  odbc_setoption($conn, 1, SQL_CONCURRENCY, SQL_CONCUR_VALUES);
  odbc_exec($conn, "SELECT * FROM test1 WITH(UPDLOCK HOLDLOCK) WHERE
ID=1");


The drawback of the workaround is that it does not work
for persistent connections.
But it would be nice to have persistent connections also.

So, I propose some extensions on the arguments of
odbc_connect/odbc_pconnect:

  int odbc_connect (string dsn, string user, string password [, int
cursor_type[, array default_statement_options]])

So it could be used like this:
  $dso = array(SQL_CURSOR_TYPE=>SQL_CURSOR_DYNAMIC,
              SQL_CONCURRENCY=>SQL_CONCUR_VALUES);
  $conn = odbc_connect("DSN", "user", "pass", SQL_CUR_USE_DRIVER,
$dso);

You could either set the defaults with SQLSetConnectOption
after SQLConnect or do a SQLSetStmtOption after allocating
an ODBC statement handle for all the items of the array.

Maybe it would be possible to change the signature of
odbc_connect/odbc_pconnect to:
  int odbc_connect (string dsn, string user, string password [, mixed
odbc_options])
where mixed means the (current) int or the proposed array.

Advantages:
- Persistent connections could be made to accept some
  statement options because odbc_pconnect has all the 
  information for discriminating and selecting an
  appropriate connection.

There seems to be a similar problem reported
with bug id #9738 (http://bugs.php.net/bug.php?id=9738).
But instead of providing some sort of "odbc_prepare_clean"
I would prefer to extend the capability of setting ODBC
statement options in a much more flexible way that can be
used for persistent connections also.



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=13838&edit=1

Reply via email to