Re: Parameter passing with freetds/MSSQL2000

Dave Cole <[email protected]>
Newsgroups gmane.comp.python.sybase
Message-ID <[email protected]>
> What is the current status regarding parameter passing with
> freetds/MSSQL2000? I get an error if I try simple queries.
> 
> import Sybase as dbapi
> 
> con=dbapi.connect('cazalla','gotta','password','personal')
> cur=con.cursor()
> cur.execute('select * from usuarios where cd_usuario=@u',  
> {'@u':'marcos'})
> pprint.pprint(cur.fetchall())
> 
> This is what I get (line numbers are incorrect)
> 
> Traceback (most recent call last):
>   File "etcPythonSybase.py", line 191, in ?
>     cur.execute('select * from usuarios where
> cd_usuario=@u',{'@u':'marcos'})
>   File "/usr/lib/python2.2/site-packages/Sybase.py", line 379, in
> execute
>     self._raise_error(Error, 'ct_param')
>   File "/usr/lib/python2.2/site-packages/Sybase.py", line 309, in
> _raise_error
>     raise exc(text)
> Sybase.Error: ct_param

I think it still has issues.  :-)

Looking at the FreeTDS 0.61 source for ct_param():

CS_RETCODE
ct_param(CS_COMMAND * cmd, CS_DATAFMT * datafmt, CS_VOID * data, CS_INT datalen, CS_SMALLINT indicator)
{
TDSSOCKET *tds;
TDSDYNAMIC *dyn;

/* TDSINPUTPARAM param; */

        tdsdump_log(TDS_DBG_FUNC, "%L inside ct_param()\n");
        tdsdump_log(TDS_DBG_INFO1, "%L ct_param() data addr = %d data length = %d\n", data, datalen);

        tds = cmd->con->tds_socket;

        dyn = tds_lookup_dynamic(tds, cmd->dyn_id);

        /* TODO */
        return CS_FAIL;
/*
        dyn = tds->dyns[elem];
        param = tds_add_input_param(dyn);
        param->column_type = _ct_get_server_type(datafmt->datatype);
        param->varaddr = data;
        if (datalen==CS_NULLTERM) {
                param->column_bindlen = 0;
        } else {
                param->column_bindlen = datalen;
        }
        param->is_null = indicator;

        return CS_SUCCEED;
*/
}


Note that the code which would actually do something is commented out
and the function unconditionally returns CS_FAIL.

So for the being, you cannot pass parameters to Cursor.execute() or
Cursor.callproc(), you must build a query string which does not use
parameters.

If I was really clever I would make Sybase.py adapt to the presense of
FreeTDS and turn have it shield you from that limitation in FreeTDS.

- Dave

-- 
http://www.object-craft.com.au
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.