Page 1 of 1
I can't delete a record from fb 2.1.1 database with zeoslib!
Posted: 26.02.2009, 08:29
by lukezeoslib
Hi, guys...I am trying to use fb 2.1.1 embed edition+ zeoslib 6.6.4 + delphi 7 in my project.
Today, I tried to understand how to delete a record or many records from a dataset.
Fistly, I put a tzconnection, tztable, datasource, dbgrid into my form and, then connected the database, it is ok, dbgrid showed all the data and, the next step was to click a button to delete the first record from database, as below:
{q is the name of tztable}
q.first;
q.delete;
Now, I could see the data was gone from the dbgrid, then the third step was to click another button which did below thing.
q.refresh;
Do you know what happened? The deleted first record was appeared in the dbgrid !!! I don't know the reason, it's driving me crazy...
I tried to use the bde's demo database without zeoslib and repeated the steps above, it is ok.
Help me!! Thank you!
Posted: 26.02.2009, 09:05
by lukezeoslib
I don't know what's happened. Just 5 minutes ago, I rewrited the program, and result is ok. I am not sure where is the problem. The demo program was still a simple program.
I will try to recompile the zeoslib components, because I used a simplify version(without supporting other database, just left fb and ib) components before, it gave me a unwanted reason and, after that I recompiled and installed the full version of zeoslib...I guest and do not hope that is the reason.
Posted: 26.02.2009, 09:28
by nostradumbass
>> q.delete;
will only delete the record from the dataset and not from the database. To delete from the database, you need to execute a SQL statement against the database to do the same. Either you can do this with Query component or with a Stored Proc component.
Posted: 26.02.2009, 09:56
by mdaems
nostradumbass,
With zeoslib no special updates queries should be necessary to insert/update/delete records from a table when you're using a TZTable component.
There's the exception of a table without primary/unique keys. In those cases there's the risk of deleting/updating multiple rows by deleting/updating one row from the grid because it's impossible to automatically write a query which deletes/updates only one row.
The only reason I can think of why lukezeoslib had this strange effect was the cachedupdates setting that may have been different in the two tries.
Mark
Posted: 26.02.2009, 13:19
by nostradumbass
>>With zeoslib no special updates queries should be necessary to insert/update/delete records from a table when you're using a TZTable component.
Yes. I overlooked that he mentioned TZTable.
-ND
Posted: 27.02.2009, 23:52
by lukezeoslib
Sorry, it's my failure.
After I could not use tztable + dbgrid to delete selected records or a record, I changed the components, I directly used the tzquery + tzupdatesql to do the same thing, it was ok. I don't know why, but I'm 100% sure that cacheupdates was set to 'false' in my demo program.
I don't know what was going on...you know, at first time, I used tzquery+tzupdatesql, but it could not delete the records, so I had to change to tztable, because I thought that tztable might be a full automatic component which did not need me to write 'delete sql', but the result was unexpected whatever deleteing a record or more records.
Another question is when I use tzupdatesql's sql editor ( by double click tzupdatesql component) to generate 'delete sql', it considers too much expression for 'delete sql', and the program shows a sql failure dialog to me as it is running.
Below is the 'delete sql' which created by tzupdatesql's sql editor automatically.
DELETE FROM warninglog
WHERE
warninglog.SE = :OLD_SE AND
warninglog.TREE = :OLD_TREE AND
warninglog.REGION = :OLD_REGION AND
warninglog.RACK = :OLD_RACK AND
warninglog.IP = :OLD_IP AND
((warninglog.FRAME IS NULL AND :OLD_FRAME IS NULL) OR (warninglog.FRAME = :OLD_FRAME)) AND
((warninglog.SLOT IS NULL AND :OLD_SLOT IS NULL) OR (warninglog.SLOT = :OLD_SLOT)) AND
((warninglog.CARDTYPE IS NULL AND :OLD_CARDTYPE IS NULL) OR (warninglog.CARDTYPE = :OLD_CARDTYPE)) AND
warninglog.WARNINGINFO = :OLD_WARNINGINFO AND
warninglog.DATETIME = :OLD_DATETIME
(warninglog.FRAME IS NULL AND :OLD_FRAME IS NULL)
---- this is one of the failure parts. Yes, the FRAME, SLOT, CARDTYPE are all allowed NULL in my database.