Frank Millman wrote:
I posted the following to the pyodbc google group, but got no reply - it seems a bit quiet there. I hope someone here can help.

I am using pyodbc version 2.1.6 on Windows Server 2003, connecting to Sql Server 2005.

This works -

cur.execute('select ?', None)
<pyodbc.Cursor object at 0x00A91368>
cur.fetchall()
[(None, )]

This does not work -

cur.execute('select * from ctrl.dirusers where todate is ?', None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module> pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near @P1'. (102) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)")

You may notice that the statement is not strictly DB-API 2.0 compliant. pyodbc has an extension that allows you to supply arguments directly, instead off putting them inside a tuple. I have tried with and without a tuple - the result is the same.

I would estimate that it's because you're using
"where todate is ?" in your WHERE clause, which
can only possibly be followed by a NULL -- thus making
it a not-meaningfully parameterisable query.

Unfortunately, neither will using "where todate = ?" work
helpfully with a None. The dbapi doesn't specify what a
compliant module should do so you probably need to do this:

... WHERE todate = ? OR (todate IS NULL AND ? IS NULL)

or possibly:

... WHERE ISNULL (todate, '<domain-specific-null>') = ISNULL (?, 
'<domain-specific-null>')


if you need this kind of functionality.

TJG
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to