Re: temporary tables don't work with freetds?

Frediano Ziglio <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <[email protected]>
2009/12/4 Michal Seliga <[email protected]>:
>
>
> Frediano Ziglio wrote:
>> 2009/12/1 Michal Seliga <[email protected]>:
>>> hello list
>>>
>>> I am using FreeTDS 0.82. i found problem with temporary tables, it shows when
>>> using qt (using QTDS driver) and also when using iodbctest. everything works
>>> properly when using tsql. I am using connection to microsoft sql database
>>>
>>> problem is that created temporary tables disappear and can't be used later
>>>
>>> tsql (working):
>>>
>>> test@visibuntu:~$ tsql -S mssql -U dba -P sql
>>> locale is "en_US.UTF-8"
>>> locale charset is "UTF-8"
>>> 1> use HamiltonSFA_280
>>> 2> go
>>> 1> create table #temptab(cus_id integer)
>>> 2> go
>>> 1> select * from #temptab
>>> 2> go
>>> cus_id
>>>
>>>
>>> iodbc test (not working):
>>>
>>> test@visibuntu:~$ iodbctest "DSN=mssql;UID=dba;PWD=sql;DATABASE=HamiltonSFA_280"
>>> iODBC Demonstration program
>>> This program shows an interactive SQL processor
>>> Driver Manager: 03.52.0607.1008
>>> Driver: 0.82 (libtdsodbc.so)
>>>
>>> SQL>create table #temptab(cus_id integer)
>>> Statement executed. 0 rows affected.
>>>
>>> SQL>select * from #temptab
>>> 1: SQLPrepare = [FreeTDS][SQL Server]Invalid object name '#temptab'. (208)
>>> SQLSTATE=42S02
>>> 2: SQLPrepare = [FreeTDS][SQL Server]Statement(s) could not be prepared. (8180)
>>> SQLSTATE=42000
>>>
>>> in qt (using QTDS driver) it behaves the same as with iodbc test
>>>
>>>
>>> from my past experience i guess that problem can be related to the fact that
>>> microsoft sql can't use prepare/execute step when creating temporary tables,
>>> only direct execution works. see note at
>>> http://msdn.microsoft.com/en-us/library/aa905910%28SQL.80%29.aspx
>>>
>>>
>>> so is it known problem or something new?
>>> and is there any possible workaround to make it work?
>>>
>>> thanks
>>
>> I was not aware of this problem however is a protocol server problem,
>> not a client one :(
>> So FreeTDS is correct (I treied with MS ODBC and got the same issue).
>> The solution is not to use SQLPrepare/SQLExecute but use
>> SQLExecDirect... a workaround would be not use prepared statement if
>> not parameters but this create incompatibility... if client wants
>> prepared statements it got prepared statements...
>>
>
> i know about it, problem is that i am not using ODBC driver, but direct TDS
> (becaus qt+iodbc+freetds is complete fail right now, qt+freetds works at least
> partially). qt is using dbsqlexec(..) in its tds driver to launch query, there
> are no extra prepare/exec steps, but still its not working
>

I saw your code at http://bugreports.qt.nokia.com/browse/QTBUG-850.
I looked at dblib code and qt code. Our dblib does not use prepared
statements at all. The problem is that QTDS open a new connection for
every result so this cause the problem (beside performance ones!).
Looking at qsql_tds.cpp you can see that dbopen is called in
QTDSDriver::open but after some rows dbclose is called (also there is
no DBPROCESS in QTDSDriverPrivate but only in QTDSResultPrivate). A
workaround would be to use the same result for all queries...
I would suggest to use odbc instead. I uploaded some patches for QT,
you can find post 0.82 patches at http://freetds.sf.net site.
Only 4 sub-tests failed using patched version. I have to say that CVS
version fails only a single test and support better unicode.

freddy77
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.