| Online Eiffel Documentation

EiffelStudio

# Data Object Coupling

A smart way to work with relational databases is to have Eiffel objects directly mapping relational tables. Three EiffelStore classes enable this coupling:

- DB_REPOSITORY objectsdescribe a relational table and allow Eiffel to create objects mapping database tables.
- DB_STORE works directly with DB_REPOSITORY objects to insert data into relational tables.
- DB_SELECTION canmap a database query result into Eiffel objects.

## Describing relational tables with DB_REPOSITORY

A DB_REPOSITORY object stores available information about a table. To access this information, you mainly have to give the table name and load the table description:

    	repository: DB_REPOSITORY
    	...
    	create repository.make ("CONTACTS")
    	repository.load
    	if repository.exists then
    		...
    	end

Tip: Loading a table description is often a costly operation: table has to be fetched among existing tables then every table column description must be loaded. Hence it is better to store and reuse a repository (maybe with a HASH_TABLE) once it has been loaded.

Using the table information, DB_REPOSITORY then helps generating Eiffel classes mapping relational tables:

- You can directly use {DB_REPOSITORY}.generate_class. Generated class may look like:

      	class CONTACTS

      	feature -- Access

      	id: INTEGER
      	...
      	feature -- Settings

      	set_id (an_id: INTEGER) is
      			-- Set an_id to id.
      		do
      			id := an_id
      		end
      	...

  Note: The EiffelStore Wizard uses the generation.generator cluster to generate the classes mapped to your database.

## Inserting data in the database

DB_STORE lets you easily insert rows into a table using:

- the table description provided by DB_REPOSITORY.
- a class mapping the relational table.

This is straight-forward since you only have to give DB_STORE the object filled with the table values. Suppose you want to add a contact into your database:

    	storage: DB_STORE
    	contacts_rep: DB_REPOSITORY
    	a_contact: CONTACTS
    	...
    	create storage.make
    		-- contacts_rep is loaded and exists.
    	storage.set_repository (contacts_rep)
    		-- a_contact carries values to insert into the database.
    	storage.put (a_contact)

## Accessing database content with Eiffel objects

DB_SELECTION lets you map data retrieved from the database into Eiffel objects: Result column names must match object attributes names so you can use for instance classes created by DB_REPOSITORY. Class DB_ACTION redefines ACTION and can be used to retrieve Eiffel objects directly into an ARRAYED_LIST:

    	selection: DB_SELECTION
    	list_filling: DB_ACTION [CONTACTS]
    	contact: CONTACTS
    	...
    	selection.object_convert (contact)
    	create list_filling.make (selection, contact)
    	selection.set_action (list_filling)
    	...
    	selection.load_result
    	if selection.is_ok then
    		Result := list_filling.list
    	end

Note: You can see how actions are used in DB_SELECTION.

See Also
Performing a database selection.
Database-specific structures use.