[Lazarus] What is a TSQLTransaction and why do I need one?
Mark Morgan Lloyd
markMLl.lazarus at telemetry.co.uk
Tue Nov 30 13:15:55 CET 2010
Joost van der Sluis wrote:
>> If I could ask: where can I find a description of how TSQLQuery etc.
>> should be used for non-trivial applications? For example, if I want to
>> set up an explicit transaction, insert a few hundred rows of data, and
>> then make an explicit decision on whether I commit or rollback?
>
> transaction.create
> sqlquery.transaction := just created transaction.
> sqlquery.sql := 'insert/update table ....'
> for i := 0 to few hundred do
> sqlquery.execsql
> transaction.commit/rollback
I think I've got that. So TSQLQuery.ExecSql is good for statements that
don't return a result set- I don't have to go down to the connection
object to get this functionality.
>> I can see TSQLQuery.InsertSQL etc., but how should they be used? If I
>> want to force a lock on a table how should I do it?
>
> In most cases you don't need them. The TSQLQuery is a TBufDataset. This
> dataset fetches data from a source. (In DBExpress this source is a
> dataprovider. In sqldb the source can be defined by a descendant, in
> this case the TSQLQuery. But other sources are possible. It would also
> be possible to create a descendant which uses a dataprovider-like
> component)
>
> The dataset is kept/cached in memory. The changes are kept in an
> update-buffer.
>
> When you call ApplyUpdates, all changes in the update-buffer are pushed
> to the underlying dataset. (Again, this is handled in a descendant,
> Delphi uses the dataprovider)
>
> What TSqlQuery does when it has to push changes to the database-server,
> is creating update/delete/insert sql-statements for each change. Well,
> in fact it parses the provided SQL to see if it can create this
> statements (using parameters) automatically.
So if I'm reading you correctly, ApplyUpdates in this case uses the .SQL
property with parameters...
> There is a way however to provide these update/insert/delete statements
> manually, that's where the .InsertSQL etc properties are for.
>
> In fpc 2.4.2 and further the TBufDataset has one build-in mechanism of
> data retrieval, which is streaming to a binary format. Or, when you add
> the xmlstreaming unit, to the same xml format as TClientDataset uses.
..while this case uses .InsertSQL etc. What determines which case
applies- is it purely whether .InsertSQL etc. are defined?
Is there somewhere I can hook into the TSQLQuery to (a) see exactly what
query was passed to the server (b) collect any error text and (c) get
execution timing?
--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk
[Opinions above are the author's, not those of his employers or colleagues]
More information about the Lazarus
mailing list