[fpc-devel] TField.FieldName: how about database and table names?

Michael Van Canneyt michael.vancanneyt at wisa.be
Fri Apr 20 09:09:43 CEST 2007



On Thu, 19 Apr 2007, Bram Kuijvenhoven wrote:

> Hi,
> 
> Thank you for your reply, Michael, and also Leonardo.
> 
> I will try to explain the background to my question a little more; I will need
> to adapt TODBCConnection anyway, but I want to know how this could be done
> best.
> 
> Michael Van Canneyt wrote:
> > 
> > On Wed, 18 Apr 2007, Bram Kuijvenhoven wrote:
> > 
> > > Hi!
> > >
> > > The TField class from the db unit defines a FieldName. When using SQL
> > > queries,
> > > columns in the result set can be fully qualified using the form
> > > 'database.table.field'. Apparently FieldName only constitus the latter
> > > part.
> > >
> > > When using an SQL query like
> > >
> > >  SELECT * FROM myTable AS t1, myTable AS t2
> > >
> > > how should one distinguish between t1.aField and t2.aField when using
> > > TField?
> > 
> > That depends on the engine. The engine assigns a unique name to each field
> > in the result set. This differs between engines, and can differ between
> > versions of the engine.
> > 
> > Run a query with an aggregate field on Interbase 6, run the same query on
> > Firebird 1. You'll see that the aggregate field is named differently.
> 
> In ODBC, the columns in the result set have a number of 'descriptor fields'
> that are connected to their 'name':
> - SQL_DESC_BASE_COLUMN_NAME
> - SQL_DESC_BASE_TABLE_NAME
> - SQL_DESC_CATALOG_NAME
> - SQL_DESC_NAME (<--- currently used in TODBCConnection as FieldNames)
> - SQL_DESC_SCHEMA_NAME
> - SQL_DESC_TABLE_NAME
> (Source:
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcsqlsetdescfield.asp,
> under 'FieldIdentifier Argument')
> 
> There is no statement in the ODBC specification claiming that any of these
> field names should be unique. It appears that I must implement a procedure in
> TODBCConnection to ensure the FieldNames are unique.

The SQL standard specifies this, as far as I know ?

> 
> To create unique FieldNames I can indeed use the technique proposed by
> Leonardo (age, age1, age2, etc.); this will ensure uniqueness of FieldNames.
> 
> For the purposes of my application, however, it would also be nice if I could
> tell the 'components' catalog/database, table/schema and column/field of a
> field, as given by the ODBC driver.

Yes, but this behaviour would be unique to ODBC. Not something to generalize.

>  
> > > Is there currently a feature for this in the data model, or should we
> > > perhaps
> > > add two additional properties -- DatabaseName and TableName -- to a
> > > TSQLField
> > > (and TSQLFieldDef) descendant? (which then could be used by SQLDB etc.)
> > 
> > No, because:
> > 
> > 1. DatabaseName you can get from the connection component. We don't support
> >    multi-connection queries, and AFAIK most engines don't support it
> >    either...
> 
> I did not refer to multi-connection queries, but multi-catalog queries; e.g.
> in MySQL one can perfectly do a query like
> 
>  SELECT dbFoo.tableBar.aField, dbBar.tableFoor.anotherField
>    FROM dbFoo.tableBar, dbBar.tblFoo
> 
> Here dbFoo and dbBar are two catalogs (or: databases).

I didn't know you can connect to 2 databases at once in mysql ? Is this new
in MySQL 5 ?

> 
> In TODBCConnection the DatabaseName has a different meaning than with e.g.
> TMySQLConnectionXX; it actually refers to a DSN, which I thought to be more
> appropriate in the setting of ODBC. Another reason I used DatabaseName for a
> DSN, is that there is no ODBC-defined connection parameter defining the
> 'database' to connect to, as with for example MySQL. The MySQL ODBC driver
> defines the DATABASE parameter for this, but this is not part of the ODBC
> specification. (Note: use TODBCConnection.Params to specify custom parameters
> such as DATABASE=myDB and SERVER=127.0.0.1) Some database driver operate on
> files, e.g. the MS Access driver, which uses the DBQ parameter to specify a
> file that holds the database.

Yes, and all this is why I think such thing should not be part of TDataset/TField.
It's very ODBC specific.

> 
> > 2. Tablename makes no sense if you execute a stored procedure.
> 
> For ODBC, if a tablename makes no sense, the corresponding descriptor field is
> simply an empty string. We can copy this behaviour.
> 
> > Also, it would take a lot of extra queries to be able to retrieve these
> > values, and this would seriously impact performance. If there is anything
> > we should not compromise on, it's performance.
> 
> For ODBC, the information does not require additional queries, only some API
> calls, which could also be delayed until the properties are actually read.

Yes, but this would not be so for Firebird or - as far as I know - MySQL.
There you would need additional queries to retrieve such information.
Therefore I don't think that having such information available should
be part of the standard set of SQLDB or TDataset.

> 
> > The only thing we can do is add the 'Origin' property such as Delphi has it.
> > And even then, this is of limited use.
> 
> What is this 'Origin' property? I'm curious.

It's equivalent to TableName.FieldName. It's mainly used for the
DatasetProvider resolver, I think.

Michael.



More information about the fpc-devel mailing list