I think your problem may be due to changing from one set of database components to another and then assuming that it will work the same way.
For example, I don't recognise compile time options such as "-dNoRefreshAfterInsert". Are these zeos specific? This symbol is not present in the DB unit, and I don't know zeos.
You seem to finding problems with FieldDefs. Again, these may change between database access libraries. FieldDefs are object oriented and are often sub-classed by a database driver. For example, IBX has its own extended TIBStringField for string types so that it can correctly transliterate to and from the database character set. The information is passed to the TIBStringField by a TIBFieldDef = class(TFieldDef).
You will typically need to delete and re-create any fielddefs created in the Lazarus IDE Field Editor when you move between database drivers.
TBookmark is always dependent on the database driver. TDataset does not define its semantic. It could be a record number or a pointer to a buffer, etc. If you refresh a row then a TBookmark should not change, but if you refresh a dataset then... refer to your database driver documentation to see what happens next.