"Nemanja Corlija" <[EMAIL PROTECTED]> wrote:
> On 8/8/06, Dixon <[EMAIL PROTECTED]> wrote:
> >
> > I have prepared the following wide text string:
> >
> >     L"SELECT ROWID FROM indext WHERE state='1' AND clientName='?' ORDER
> >     BY size DESC"
> >
> > with sqlite3_prepare16,  I then call sqlite3_bind_parameter_count on the
> > resulting statement.  I get 0 back when I expected 1.  Is this an
> > invalid way to specify a placeholder for a variable that I will bind later?
> 
> You don't need to enclose ? with any quotes. Try it like this:
> 
>   WHERE state='1' AND clientName=?
> 

Nemanja is correct.  I have an unrelated comment.

sqlite3_prepare16() will work fine for what you are doing.  But
I want you to be aware that the only thing sqlite3_prepare16()
does is convert the SQL from UTF16 to UTF8 then pass the result
on to sqlite3_prepare().  This is because I do not want to bloat
the SQLite code base with separate tokenizers and parsers for
UTF-8 and UTF-16.

So there really is no benefit to using sqlite3_prepare16()
instead of sqlite3_prepare().

On the other hand, APIs like sqlite3_bind_text16() do not do
any unnecessary conversion and will use the native UTF-16 string
if that is the appropriate thing to do.   There is great benefit
in using sqlite3_bind_text16() instead of sqlite3_bind_text() if
you have a UTF-16 database.

Note that it is perfectly acceptable to call sqlite3_bind_text16()
on a statement that you prepared using sqlite3_prepare().  Likewise,
you could call sqlite3_bind_text() on a statement prepared with
sqlite3_prepare16().  You do not have to stick with a single
encoding.  All necessary conversions are done automatically.
--
D. Richard Hipp   <[EMAIL PROTECTED]>

Reply via email to