Newsgroup: it.comp.lang.delphi
Titolo: pkey ADO

Ciao come capire se un campo è una pkey. (ADO)

 Ciao come capire se un campo è una pkey.
Imho devi interrogare il catalogo del database.
Che db stai interrogando via ado?
-- 
Morde

 Che db stai interrogando via ado?
Veramente non esiste un metodo senza consultare il catalogo ? Mi
sembra strano che sia possibile ottenete le FK e non le PK.

Se ti può essere d'aiuto puoi usare *REQUIRED* per capire se un campo
è necessario...  --> PKey

 č necessario...  --> PKey
Come gią detto altre volte, campo required non significa necessariamente
campo appartenente alla chiave primaria.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 campo appartenente alla chiave primaria.
Grazie, ma se è anche Unique ! come saperlo ?

 Grazie, ma se č anche Unique ! come saperlo ?
Devi interrogare l'information_schema (o equivalente) del db (che non
menzioni) che stai utilizzando.


 menzioni) che stai utilizzando.
Oracle Express. Ok information_schema grazie ma scusate Required +
Unique non va bene ? Perchè ?

 [...] ma scusate Required + Unique non va bene ? Perchè ?
Perché Required è solo una proprietà booleana gestita da Delphi e non
necessariamente mappata sul campo NOT NULL del database e perché un campo
Unique non necessariamente appartiene alla chiave primaria.
Devi investigare l'information_schema.


 Unique non necessariamente appartiene alla chiave primaria.
Puoi chiarire meglio cosa intendi per mappata sul campo NOT NULL del
database ?
MI spiego meglio, io pensavo di interrogare gli oggetti "persistenti"
e non "dinamici" del DB usando un recordset.

 e non "dinamici" del DB usando un recordset.
Interroga il database, è l'unica fonte di informazione certa.


> Interroga il database, è l'unica fonte di informazione certa.
OK con information_schema! Puoi spiegarmi meglio per approfondire, in
che modo required non è associato necessariamente a un campo di una
pkey ?
Ciao

Mi spiego malissimo. Pensavo di interrogare gli oggetti persistenti
con qualcosa del genere: if ADOtable1.Recordset.Fields[..].Attributes
and 32 = 0 then ..

fraz...@libero.it
 ha scritto:

Perché, solo per fare un esempio, potrebbe essere richiesto che venga 
*sempre* fornito il CAP (codice avviamento postale) di un indirizzo 
postale :)
Certamente, questo campo non farà parte della pkey.
ciao.

 Certamente, questo campo non farà parte della pkey.
Pensavo di interrogare gli oggetti persistenti con qualcosa del
genere: if ADOtable1.Recordset.Fields[..].Attributes and 32 = 0
then ...
quindi vedere se il campo è anche unique.
Ciao

quindi vedere se il campo è anche unique.
Questa discussione puzza. Puzza molto di trollistico, visto che su
queste stesse basi nacque tempo fa un thread in cui il troll
deficiente che gira (-va, spero) nel gruppo diede il meglio di sé.
Ti ho detto come usare la tecnica migliore per assicurarti che i campi
di una tabella sono in chiave primaria; a che pro ti serve conoscere
il metodo sbagliato? perché vuoi informazioni su Required?
Come già detto, basarsi solo sul fatto che un campo sia required, a
livello applicativo e associare questa informazione al fatto che il
campo costituisca una chiave alternativa *NON* è una prova sufficiente
a decretare una chiave primaria. Interroga information_schema e vivi
tranquillo.



Required significa che un campo è obbligatorio e un campo obbligatorio
non è necessariamente appartenente a una chiave primaria.

Interroga information_schema e vivi tranquillo.
Si lo so... Grazie

informazione riguardo la pkey di un campo
Ma a che ti serve?

> Ma a che ti serve?
Dovrei creare delle ForeignKey (passato già come mi consigli a IDS) .
Ma è almeno possibile determinate la proprietà IsUnique ?
ciao!

Come mi è stato segnalato su 
www.delphiedintorni.it
 è possibile usare
openschema ?
Es. di funzione per PK su MS.
http://support.microsoft.com/kb/182831/it

 Come mi è stato segnalato suwww.delphiedintorni.itè possibile usare
Si ho visto grazie.. Hai per caso del codice da postare ?

 Forse chiedo troppo, dove posso trovare un esempio di codice.
Sussurrando la parolina che ti ho suggerito (OpenSchema) insieme alla
parolina Delphi a Google ottieni in cambio un sacco di esempi.
Questo è un metodo che uso io:
procedure TEDWDBADOMetadataProvider.FetchTablePrimaryKey(const
ATable:
TEDWDBTableInfo);
var
   LPrimaryKeyDataSet: TADODataSet;
begin
   LPrimaryKeyDataSet := TADODataSet.Create(nil);
   try
     FConnection.OpenSchema(siPrimaryKeys,
       VarArrayOf([Unassigned, Unassigned, ATable.Name]),
       EmptyParam, LPrimaryKeyDataSet);
     while not LPrimaryKeyDataSet.Eof do
     begin
       if 
ATable.PrimaryKey.Name
 = '' then
 
ATable.PrimaryKey.Name
 :=
LPrimaryKeyDataSet.FieldByName('PK_NAME').AsString
       else if 
ATable.PrimaryKey.Name
 <>
LPrimaryKeyDataSet.FieldByName('PK_NAME').AsString then
         raise EEDWError.Create('Error fetching primary key data for
table ' + ATable.Name);
ATable.PrimaryKey.ColumnNames.Add(LPrimaryKeyDataSet.FieldByName('COLUMN_NAME').AsString);
       LPrimaryKeyDataSet.Next;
     end;
   finally
     LPrimaryKeyDataSet.Free;
   end;
end;
Ciao
--
Nando D.

anche le FK etc..
procedure TForm1.PrimaryKey;
var
DataSet: TADODataSet;
begin
DataSet := TADODataSet.Create(nil);
try
FConnection.OpenSchema(siPrimarykeys,VarArrayOf
([Unassigned,Unassigned,'ANATRA']),
       EmptyParam, DataSet);
    while not DataSet.Eof do
     begin
     // Nomi tipicamente di Information Schemata
     showmessage(DataSet.FieldByName('PK_NAME').AsString);
     showmessage(DataSet.FieldByName('COLUMN_NAME').AsString);
     showmessage(DataSet.FieldByName('TABLE_NAME').AsString);
     DataSet.Next;
     end;
   finally
     DataSet.Free;
   end;
   DataSet := TADODataSet.Create(nil);
   try
     FConnection.OpenSchema(siForeignkeys,
       VarArrayOf([Unassigned, Unassigned,  'MiaTabella']),
       EmptyParam, DataSet);
    while not DataSet.Eof do
     begin
     showmessage(DataSet.FieldByName('FK_NAME').AsString);
     showmessage(DataSet.FieldByName('FK_COLUMN_NAME').AsString);
     showmessage(DataSet.FieldByName('FK_TABLE_NAME').AsString);
     DataSet.Next;
     end;
   finally
     DataSet.Free;
   end;
--- posted by geoForum on 
http://www.delphiedintorni.it