From: <re...@du...> - 2005-10-22 19:00:39
|
hi, like to ask you again.. please download tortoisecvs (or some other cvs client), and tell me the name of your sourceforge account. cvs is so convenient for this, and i may make less errors merging.. Dak wrote: >Hello Rene > >I have suggestion, how to regularize differences >between Query and QueryW command in TLiteDB class. I >suggest use in both metods next functions >SQLite3_Prepare(16), SQLite3_Step and >SQLite3_Finalize, because this way makes it possible >returns more complex info about returned columns in >ResultSet. I will place current implementation Query >metod (with SQLite_exec function) for example in to >new metod SimpleQuery or i dont use this anyway. I >will changne this, that SimpleQuery return no >resultset and be very simple. The final solution >depends on you. In actual implementation of metods >Query and QueryW is couple of missing thigs. If i want >get content table (for exapmle SELECT * FROM Table1;) >and table is full empty (has no row), both metods dont >return name of columns. In DB browser i need show name >of columns even if table is full empty too. Metod >QueryW dont support execution of SQL multistatements. >All this missing thigs i try solve in my proposal. My >proposal looks like in this next metods, it is noly >pseudo-code, full implementation depends on you, you >know your code complex and in detail. > >function TLiteDB.SimpleQuery(SQL: String): Boolean; >begin > use classic way with SQLite_exec. Maybe is possible >completely leave out @QueryCallBack function. Then is >possible use this function for speed execution of >large, a lot of sql statements which dont need >ResultSet. >end; > >function TLiteDB.Query(SQL: String): Boolean; >var > SQLStatement: PAnsiChar; > Stmt: Pointer; > sr,qr: Integer; > FLastError: Integer; >begin > SQLStatement := PAnsiChar(SQL); > > repeat > > try > FLastError := SQLite3_prepare(FBaseInfo.FHandle, >SQLStatement, -1, Stmt, SQLStatement); > > if FLastError = SQLite_OK then > begin > //This must be first, to get definition of >columns even if table is include no rows > //This one you execute very pretty in function >StoreFields3, but this must be first! > if Not FieldDef then > begin > Columns := SQLite3_Column_count(Stmt); > for i := 0 to Columns - 1 do > begin > name := Sqlite3_Column_Name(Stmt, i); > _datatype := Sqlite3_Column_Type (Stmt, >i); > end; > end; > > sr := SQLite3_step (Stmt); > > while sr=SQLITE_BUSY do > begin > sleep(0); > sr := SQLite3_step (Stmt); > end; > > while sr=SQLITE_ROW do > begin > //Geting simple fields of current row > //This one you execute very pretty in >function StoreRow3 > Columns := SQLite3_Column_count(Stmt); > for i := 0 to Columns - 1 do > begin > Value := SQLite3_Column_Text(Stmt, i); > end; > sr := SQLite3_step(Stmt); > while sr=SQLITE_BUSY do > begin > sleep(0); > sr := SQLite3_step (Stmt); > end; > end; > > if sr in [SQLITE_ERROR, SQLITE_MISUSE] then > begin > FLastErrorText := >SQLite3_errormsg(FBaseInfo.FHandle); > FLastError := >SQLite3_errcode(FBaseInfo.FHandle); > end > else > begin > FLastErrorText := ''; > FLastError := 0; > end; > end > else > FLastErrorText := SQLite3_errormsg >(FBaseInfo.FHandle); > > finally > //I see this finalisation in others SQLite >wrappers and works well > SQLite3_reset(Stmt); > SQLite3_finalize(Stmt); > end; > > until SQLStatement^ = #0; //This one solve problem >with SQL Multi-Statement > >end; > >function TLiteDB.QueryW(SQL: WideString): Boolean; >var > SQLStatement: PWideChar; > Stmt: Pointer; > sr,qr: Integer; > FLastError: Integer; >begin > SQLStatement := PAnsiChar(SQL); > > repeat > > try > FLastError := >SQLite3_prepare16(FBaseInfo.FHandle, SQLStatement, -1, >Stmt, SQLStatement); > > if FLastError = SQLite_OK then > begin > //This must be first, to get definition of >columns even if table is include no rows > //This one you execute very pretty in function >StoreFields3, but this must be first! > if Not FieldDef then > begin > Columns := SQLite3_Column_count(Stmt); > for i := 0 to Columns - 1 do > begin > name := Sqlite3_Column_Name16(Stmt, i); > _datatype := Sqlite3_Column_Type (Stmt, >i); > end; > end; > > sr := SQLite3_step (Stmt); > > while sr=SQLITE_BUSY do > begin > sleep(0); > sr := SQLite3_step (Stmt); > end; > > while sr=SQLITE_ROW do > begin > //Geting simple fields of current row > //This one you execute very pretty in >function StoreRow3 > Columns := SQLite3_Column_count(Stmt); > for i := 0 to Columns - 1 do > begin > Value := SQLite3_Column_Text16(Stmt, i); > end; > sr := SQLite3_step(Stmt); > while sr=SQLITE_BUSY do > begin > sleep(0); > sr := SQLite3_step (Stmt); > end; > end; > > if sr in [SQLITE_ERROR, SQLITE_MISUSE] then > begin > FLastErrorText := >SQLite3_errormsg16(FBaseInfo.FHandle); > FLastError := >SQLite3_errcode(FBaseInfo.FHandle); > end > else > begin > FLastErrorText := ''; > FLastError := 0; > end; > end > else > FLastErrorText := SQLite3_errormsg16 >(FBaseInfo.FHandle); > > finally > //I see this finalisation in others SQLite >wrappers and works well > SQLite3_reset(Stmt); > SQLite3_finalize(Stmt); > end; > > until SQLStatement^ = #0; //This one solve problem >with SQL Multi-Statement > >end; > >Thanks my riend Flyman for his help with translation. > >Dak > > > >__________________________________________________ >Do You Yahoo!? >Tired of spam? Yahoo! Mail has the best spam protection around >http://mail.yahoo.com > > >------------------------------------------------------- >This SF.Net email is sponsored by the JBoss Inc. >Get Certified Today * Register for a JBoss Training Course >Free Certification Exam for All Training Attendees Through End of 2005 >Visit http://www.jboss.com/services/certification for more information >_______________________________________________ >libsql-discussion mailing list >lib...@li... >https://lists.sourceforge.net/lists/listinfo/libsql-discussion > > |