je suis en train de modifier mes compos (partie DB Express) afin de pouvoir gérer plusieurs types de bases de données.
Je suis actuellement en train de réecrire la fonction suivante qui me renvoie la primary key d' une table:
function SQLGetPrimaryKey(aConnection: TSQLConnection; aTableName: String): String;
var
aQuery: TSQLQuery;
Column_name: String;
begin
Result := '';
if aTableName = '' then Exit;
aQuery := TSQLQuery.Create(Nil);
aQuery.SQLConnection := aConnection;
case GetDbxConnectionDriver(aConnection) of
cdASA: ;
cdASE: ;
cdBlackfishSQL: ;
cdDatasnap: ;
cdDb2: ;
cdInformix: ;
cdInterbase: ;
cdMSSQL:
begin
aQuery.SQL.Clear;
aQuery.SQL.Add('SELECT i.name AS IndexName,');
aQuery.SQL.Add('COL_NAME(ic.OBJECT_ID,ic.column_id) AS column_name');
aQuery.SQL.Add('FROM sys.indexes AS i');
aQuery.SQL.Add('INNER JOIN sys.index_columns AS ic');
aQuery.SQL.Add('ON i.OBJECT_ID = ic.OBJECT_ID');
aQuery.SQL.Add('AND i.index_id = ic.index_id');
aQuery.SQL.Add('WHERE (i.is_primary_key = 1) and (OBJECT_NAME(ic.OBJECT_ID) LIKE ' + SQLGetStringExpr(aTableName) + ')');
Column_name := 'column_name';
end;
cdMySQL:
begin
aQuery.SQL.Text :'show index from ' + cyDBX.BackQuotedStr(aTableName) + ' where Key_name ''PRIMARY''';
Column_name := 'column_name';
end;
cdOracle: ;
end;
aQuery.Active := true;
if not aQuery.Eof then
Result := aQuery.FieldByName(Column_name).AsString;
aQuery.Active := false;
aQuery.Free;
end;
Comme vous pouvez le voir, je ne gère que MySQL et MS SQL.
Ce que je voudrai est, dans le cas oú vous pouvez tester , me donner le code pour la autres base de données.
Pas vu Firebird dans ta liste... Je te mets la requête quand même (avec le paramètre P_TableName pour la table à cibler) :
Select t1.RDB$FIELD_NAME as column_name
From RDB$INDEX_SEGMENTS t1
Inner Join RDB$INDICES t2
On t1.RDB$INDEX_NAME = t2.RDB$INDEX_NAME
Inner join RDB$RELATION_CONSTRAINTS t3
on t2.RDB$RELATION_NAME = t3.RDB$RELATION_NAME
Where t2.RDB$RELATION_NAME = :P_TableName
and t3.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
ORDER BY t1.RDB$FIELD_POSITION
Je vois que tu mets aussi Datasnap. J'avais cru comprendre que ce n'était qu'un moyen de développer des applis Client/Serveur... C'est aussi un format de base de données ?
Oulààà !!! Mais heureusement que Firebird est dispo sur le TSQLConnection... Je teste ça, pas de souci (la requête était testée)
Par contre, je ne comprends pas bien le retour attendu...
if not aQuery.Eof then
Result := aQuery.FieldByName(Column_name).AsString;
Si tu as une table avec deux champs dans une clé primaire, quel est le retour de la fonction ? Un seul champ dans la clé primaire ?
et pour "update" pour les champs de la clé primaire (la précédente fonctionne aussi, mais celle ci est plus propre...) :
Select t1.RDB$FIELD_NAME as column_name
From RDB$INDEX_SEGMENTS t1
Inner Join RDB$INDICES t2
On t1.RDB$INDEX_NAME = t2.RDB$INDEX_NAME
Inner join RDB$RELATION_CONSTRAINTS t3
on (t2.RDB$RELATION_NAME = t3.RDB$RELATION_NAME AND t2.RDB$INDEX_NAME = t3.RDB$INDEX_NAME)
Where t2.RDB$RELATION_NAME = :P_TableName
and t3.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
ORDER BY t1.RDB$FIELD_POSITION
Pour Interbase, ça ne doit pas être très différent. Je ne l'ai malheureusement pas installé sur mon poste car ça ne cohabite pas terriblement bien avec Firebird...