Newsgroup: it.comp.lang.delphi
Titolo: [D7 + DB Access] Verificare runtime l'esistenza di un campo

Ciao,
volevo sapere se e' possibile verificare, all'apertura di un programma,
l'esistenza di un campo in una data tabella e, se non esiste, crearlo via
SQL.
Oppure bisogna necessariamente modificare il database con access?
Ciao
 Uso D7,ADOConnection,ADODataset,Access,WinXP
Ps il file .mdb e' stato creato con Access97
Ciao
--
(¯`·.¤ Miyomo ¤.·´¯)
********************************
miyomo IS ON 
hotmail.com
********************************

Ps il file .mdb e' stato creato con Access97
Se puoi passa a access2000, che permette anche di gestire meglio la
concorrenza degli accessi con un sistema di locking.
-- 
Morde. 
(morde at programmer dot net)

che quindi utilizzano DAO e non ADO
Se vuoi rimanere nell'ambito ADO puoi utilizzare i metodi della AdoConnection:
GetFieldNames,GetTableNames,OpenSchema....
Ciao


 SQL.
Guarda io ho fatto così:
(riporto le righe di codice dal mio programma, credo si abbastanza chiaro il
funzionamento)
DM_PRG.QRY_BAN è un TADOQuery, ma funzionerebbe anche se fosse un
TADODataSet
// Il campo da cercare è 'BA_CODCIN'
     DM_PRG.QRY_BAN.Open;
     for i:=0 to DM_PRG.QRY_BAN.FieldCount-1 do begin
        if UpperCase(DM_PRG.QRY_BAN.Fields[i].FieldName)='BA_CODCIN' then
        begin
           // Trovato Campo Nuovo, conversione già effettuata !!
           Trovato:=True;
        end;
     end;
     DM_PRG.QRY_BAN.Close;
****************************************************
****************************************************
Il resto per variare la struttura della tabella
DM_PRG.CMD_GEN è un TADOCommand
        // Crea Nuovi Campi ba_CODCIN, ba_Temp
        DM_PRG.CMD_GEN.CommandText:='ALTER TABLE BANCHE ADD ba_CODCIN text
(10),'+
                                    ' ba_Temp Text (12)';
        DM_PRG.CMD_GEN.Prepared;
        DM_PRG.CMD_GEN.Execute;
        Sleep(2000);
        // Trasferisce Valori Da Campo Vecchio ba_CODCONTO a Temporaneo
ba_Temp
        DM_PRG.CMD_GEN.CommandText:='UPDATE BANCHE SET ba_Temp=ba_CODCONTO';
        DM_PRG.CMD_GEN.Prepared;
        DM_PRG.CMD_GEN.Execute;
        Sleep(5000);
        // Cancella Campo Vecchio ba_CODCONTO lungo 10
        DM_PRG.CMD_GEN.CommandText:='ALTER TABLE BANCHE drop ba_CODCONTO';
        DM_PRG.CMD_GEN.Prepared;
        DM_PRG.CMD_GEN.Execute;
        Sleep(2000);
        // Crea Nuovi Campi ba_CODCONTO Lungo 12
        DM_PRG.CMD_GEN.CommandText:='ALTER TABLE BANCHE ADD ba_CODCONTO text
(12)';
        DM_PRG.CMD_GEN.Prepared;
        DM_PRG.CMD_GEN.Execute;
        Sleep(2000);
        // Trasferisce Valori Da Temporaneo ba_Temp a Campo Nuovo
ba_CODCONTO
        DM_PRG.CMD_GEN.CommandText:='UPDATE BANCHE SET ba_CODCONTO=ba_Temp';
        DM_PRG.CMD_GEN.Prepared;
        DM_PRG.CMD_GEN.Execute;
        Sleep(5000);
        // Cancella Campo Temporaneo
        DM_PRG.CMD_GEN.CommandText:='ALTER TABLE BANCHE drop ba_Temp';
        DM_PRG.CMD_GEN.Prepared;
        DM_PRG.CMD_GEN.Execute;
Ciao Gianluigi

 --
Scusa ma questa cosa non mi convince molto.
A me sembra sia simasto tutto invariato rispetto ad A97
il modo di locking resta sempre lo stesso
al massimo puoi lockare per pagina o al peggio tutto il recordset.
Hai info diverse?
bye :o)

Hai info diverse?
Se le memoria non mi tradisce, la differenza nel locking tra access97 e 2000
era il livello: con il 2000 si riesce ad ottenere il record-locking, mentre
fino al 97 ti limitavi al page-locking.
Cmq se cerchi su questo stesso ng i miei post di qualche mese fa, dovrebbero
esserci anche i link a M$ msdn.
Ciao
