just a little up since I have had no answers?
I'm still having the pb and cannot understand why? :)

Dennis Cote a écrit :
>
> I am forwarding this to the list in the hope that someone else will 
> have a good idea since the OP, toms, is having trouble posting himself.
>
> Dennis Cote
>
> toms wrote:
>>  ok here is the code I use for the statements:
>>
>> here is the SQL:
>>
>>     "UPDATE Statistics_Players"
>>     " SET "
>>     " iMVP = ?,"
>>     " Inflicted_iPasses = ?,"
>>     " Inflicted_iInterceptions = ?,"
>>     " Inflicted_iCatches = ?,"
>>     " Inflicted_iTouchdowns = ?,"
>>     " Inflicted_iKO = ?,"
>>     " Inflicted_iCasualties = ?,"
>>     " Inflicted_iDead = ?"
>>     " WHERE idPlayer_Listing=?"
>>
>> I init the statement like this (where _szSQL is the previous string)
>>
>>         const     char*    szTail = 0;
>>         int rc = sqlite3_prepare(m_pDB->GetSqliteDB(), _szSQL, 
>> StrLen(_szSQL), &m_pStatement, &szTail);
>>         if( rc != SQLITE_OK )
>>         {
>>             SDK_ASSERTMSG(0, "Query Init error: %s\n", 
>> sqlite3_errmsg(m_pDB->GetSqliteDB()));
>>             return;
>>         }
>>
>> then, when I want to use the query, I retrieve it (it is kept in a 
>> wrapper CQuery class), and then bind every params:
>>
>>     CQueryPlayersWriteStats* pQuery = 
>> GetDB()->GetQueryPlayersWriteStats();
>>     pQuery->Bind(CQueryPlayersWriteStats::Params::PLAYERID      , 
>> (u32)GetID()                       );
>>     pQuery->Bind(CQueryPlayersWriteStats::Params::MVP           , 
>> (u32)statsPlayer.m_uMVP            );
>>     pQuery->Bind(CQueryPlayersWriteStats::Params::PASSES        , 
>> (u32)statsPlayer.m_uNbAccuratePass );
>>     pQuery->Bind(CQueryPlayersWriteStats::Params::INTERCEPTIONS , 
>> (u32)statsPlayer.m_uNbInterception );
>>     pQuery->Bind(CQueryPlayersWriteStats::Params::CATCHES       , 
>> (u32)statsPlayer.m_uNbReception    );
>>     pQuery->Bind(CQueryPlayersWriteStats::Params::TD            , 
>> (u32)statsPlayer.m_uNbTouchDown    );
>>     pQuery->Bind(CQueryPlayersWriteStats::Params::KO            , 
>> (u32)statsPlayer.m_uNbKo           );
>>     pQuery->Bind(CQueryPlayersWriteStats::Params::CASUALTIES    , 
>> (u32)statsPlayer.m_uNbCasualties   );
>>     pQuery->Bind(CQueryPlayersWriteStats::Params::DEAD          , 
>> (u32)statsPlayer.m_uNbDeath        );
>>     pQuery->SingleExec();
>>
>> where each CQueryPlayersWriteStats::Params is an enum value between 1 
>> and 8
>>
>> And here is the code of the bind method:
>>
>>     void CQuery::Bind(u32 _uParam, s32 _iValue)
>>     {
>>         int rc = sqlite3_bind_int(m_pStatement, (int)_uParam, _iValue);
>>         if( rc != SQLITE_OK )
>>         {
>>             SDK_ASSERTMSG(0, "Query Bind error: %s\n", 
>> sqlite3_errmsg(m_pDB->GetSqliteDB()));
>>             return;
>>         }
>>     }
>>
>> And I have many versions of the bond method:
>>
>>     void            Bind            (u32 _uParam, s32 _iValue);
>>     void            Bind            (u32 _uParam, u32 _uValue);
>>     void            Bind            (u32 _uParam, f32 _fValue);
>>     void            Bind            (u32 _uParam, const char* _szValue);
>>
>> And after the bond, I only call the Step once:
>>
>>     void CQuery::SingleExec()
>>     {
>>         Reset();
>>
>>         int rc = sqlite3_step(m_pStatement);
>>
>>         if (rc == SQLITE_ROW)
>>         {
>>             SDK_WARNING(0, "Seems like a query would be more 
>> appropriate");
>>             return;
>>         }
>>
>>         if (rc != SQLITE_DONE)
>>         {
>>             SDK_WARNING(0, "Could not execute SingleExec!");
>>             return;
>>         }
>>
>>         Reset();
>>     }
>>
>> The class CQueryPlayersWriteStats inheritates from CQuery
>>
>> The only doubt I have is about calling Reset twice in the SingleExec 
>> method. It was more secure for me to do this.
>> Any idea?
>
> That isn't necessary. You should reset either before or after (I would 
> suggest before), but I doubt that is the cause of the slowdown either.
>
>> As I still cannot send on the mailling list, please feel free to 
>> forward this on it if you want :)
>>
>> Thanks for the help! :-)
>>
>>
>> Dennis Cote a écrit :
>>> toms wrote:
>>>> this is not easily doable: the database is on a server, in order to 
>>>> change fields I have to change it on the server :/
>>>
>>> I don't need to see the database itself, only the code that accesses 
>>> the database through SQLite. I thought you were concerned about 
>>> leaking info about the database by disclosing table and field names 
>>> etc.
>>>
>>>
>>>> yes: I only prepare it once, and then use this prepared statement 
>>>> to bind parameters.
>>>> Then step, but only once (because it is an UPDATE) and then reset
>>>> Maybe the gain is not so much when not used in a SELECT?
>>>>
>>>
>>> That should not be the case. The sqlite3_prepare() call does the SQL 
>>> language parsing and VDBE code generation for the query once. The 
>>> VDBE code is then executed multiple times.
>>>
>>> When using sqlite3_exec() the string containing the query is parsed, 
>>> and VDBE code is generated and then executed for each call.
>>>
>>> It doesn't really matter what type of a statement is being executed. 
>>> The benefit is amortizing one parsing and code generation time over 
>>> the the 300 calls instead of incurring that same cost for each 
>>> execution.
>>>
>>> I am suspicious about the way you are handling the reset and binding 
>>> calls.
>>>
>>> Dennis Cote
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to