Now, I change my code as follows, but, the problem is
still there. The PDA memory usage become larger and
larger. Did I miss something? Anything wrong with my
code?  Thanks.



        sqlcmd = sqlite3_mprintf( "INSERT INTO TEST( BARCODE,
TAGTYPE, PRINTDATA ) VALUES( ?, ?, ? );" );

        rc = sqlite3_prepare( db, sqlcmd, -1, &stat, 0 );
        if( rc != SQLITE_OK )
        {
                sqlite3_free( sqlcmd );
                sqlite3_close(db);
                return -1;
        }

        for( i = 0 ; i < 200000; i ++ )
        {
                // ...............
                // chrBarCode, tagtype and chrPrintData is changed
for every loop
                // ...............
                
                rc = sqlite3_bind_text( stat, 1, chrBarCode, strlen(
chrBarCode ), NULL ); 
                if( rc != SQLITE_OK )
                {
                        sqlite3_free( sqlcmd );
                        sqlite3_close(db);
                        return -1;
                }

                rc = sqlite3_bind_int( stat, 2, tagtype ); 
                if( rc != SQLITE_OK )
                {
                        sqlite3_free( sqlcmd );
                        sqlite3_close(db);
                        return -1;
                }

                rc = sqlite3_bind_blob( stat, 3, chrPrintData,
length, NULL ); 
                if( rc != SQLITE_OK )
                {
                        sqlite3_free( sqlcmd );
                        sqlite3_close(db);
                        return -1;
                }

                rc = sqlite3_step( stat );                                      
                if( rc != SQLITE_DONE )
                {
                        sqlite3_free( sqlcmd );
                        sqlite3_close(db);
                        return -1;
                }

                rc = sqlite3_reset( stat );
                if( rc != SQLITE_OK )
                {
                        sqlite3_free( sqlcmd );
                        sqlite3_close(db);
                        return -1;
                }

        }
        
        rc = sqlite3_finalize( stat );
        if( rc != SQLITE_OK )
        {
                sqlite3_free( sqlcmd );
                sqlite3_close(db);
                return -1;
        }



Best Regards,
WenYuan




--- Michael Ruck <[EMAIL PROTECTED]> wrote:

> No, you only need to create the statement once. And
> bind all variables
> inside the loop. This at least saves computation
> time. Additionally you
> should use sqlite3_mprintf instead
> of sprintf to protect against sql injection (if that
> is an issue for you.)
> 
> You're already doing it with the blob, why not with
> the other fields?
> 
> Mike
> 
> 
> -----Ursprüngliche Nachricht-----
> Von: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] Im Auftrag
> von Yang WenYuan
> Gesendet: Mittwoch, 9. April 2008 08:11
> An: General Discussion of SQLite Database
> Betreff: Re: [sqlite] WinCE Memory Problem
> 
> Thanks, Mike. 
> 
> Because, each record has different barcode, tagtype,
> and printdata. That
> means, I need to call:
> 
> sprintf( sqlcmd, "INSERT INTO TEST( BARCODE,
> TAGTYPE, PRINTDATA ) VALUES(
> %s, %d, ? );", chrBarCode, tagtype ); rc =
> sqlite3_prepare( db, sqlcmd, -1,
> &stat, 0 );
> 
> to update the contents of the each records inside
> the loop. Am I right? 
> 
> Any suggestion? Thanks.
> 
> WenYuan
> 
> 
> 
> 
> 
> --- Michael Ruck <[EMAIL PROTECTED]>
> wrote:
> 
> > You should only prepare the statement once before
> the loop. The only 
> > thing you should do in the loop itself is bind
> varying data and call 
> > sqlite_step.
> > There's no need to call prepare, reset, finalize
> inside the loop. If 
> > chrPrintData doesn't change you can also move
> bind_blob in front of 
> > the loop.
> > 
> > Mike
> > 
> > -----Ursprüngliche Nachricht-----
> > Von: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED] Im
> Auftrag von Yang WenYuan
> > Gesendet: Mittwoch, 9. April 2008 06:08
> > An: sqlite-users@sqlite.org
> > Betreff: [sqlite] WinCE Memory Problem
> > 
> > I use the Sqlite in the PDA which is WinCE OS. I
> need to add more than 
> > 200,000 records. I used sqlite3_prepare-> 
> > sqlite3_bind_blob->sqlite3_step->sqlite3_finalize
> to write each record 
> > in to Database. However, I found that after each
> record is inserted, 
> > the PDA memory became larger and larger. In the
> end, the whole PDA 
> > memory is occupied by this application and the
> system halt. Is there 
> > any thing I miss to release the memory?
> > Following is my code:
> > 
> > sqlite3 *db;
> > sqlite3_stmt * stat;
> > char *zErrMsg = 0;
> > char sqlcmd[ 512 ];
> > int rc;
> > char chrBarCode[ 16 ], chrPrintData[ 512 ]; int
> tagtype;
> > 
> > 
> > 
> > for( i = 0; i < 2000000; i ++ )
> > {   
> >     sprintf( sqlcmd, "INSERT INTO TEST( BARCODE,
> TAGTYPE, PRINTDATA ) 
> > VALUES( %s, %d, ? );", chrBarCode, tagtype );
> >     
> >     rc = sqlite3_prepare( db, sqlcmd, -1, &stat, 0 );
> >     if( rc != SQLITE_OK )
> >     {
> >         sqlite3_close(db);
> >         return -1;
> >     }
> >     
> >     rc = sqlite3_bind_blob( stat, 1, chrPrintData,
> length, NULL );
> >     if( rc != SQLITE_OK )
> >     {
> >         sqlite3_close(db);
> >         return -1;
> >     }
> >     
> >     rc = sqlite3_step( stat );                      
> >     if( rc != SQLITE_DONE )
> >     {
> >         sqlite3_close(db);
> >         return -1;
> >     }
> >     
> >     rc = sqlite3_reset( stat );
> >     if( rc != SQLITE_OK )
> >     {
> >         sqlite3_close(db);
> >         return -1;
> >     }
> >     
> >     rc = sqlite3_finalize( stat );
> >     if( rc != SQLITE_OK )
> >     {
> >         sqlite3_close(db);
> >         return -1;
> >     }
> >     
> > }
> > 
> > 
> > WenYuan
> > 
> > 
> > 
> >      
> >
>
______________________________________________________________________
> > Search, browse and book your hotels and flights
> through Yahoo! Travel.
> > http://sg.travel.yahoo.com
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@sqlite.org
> >
>
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> > 
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@sqlite.org
> >
>
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> > 
> 
> 
> 
>      
>
______________________________________________________________________
> Search, browse and book your hotels and flights
> through Yahoo! Travel.
> http://sg.travel.yahoo.com
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
>
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> 
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
>
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> 



      __________________________________________________________________ 
Yahoo! Singapore Answers 
Real people. Real questions. Real answers. Share what you know at 
http://answers.yahoo.com.sg
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to