Creazione nuova tabella con FireDAC

di il
29 risposte

Creazione nuova tabella con FireDAC

procedure Database.CreateTable(Table_Name: String);
var
 Table: TFDTable;
begin
Table := TFDTable.Create(nil);
try
  with Table do begin
       Connection := FDConnector;
       TableName := Table_Name;
       FieldDefs.Add('id',ftAutoInc,0,false);
       FieldDefs.Add('campo1',ftString,200,Nullable);
       
       AddIndex('pkId','Id','',[soPrimary]);
       OptionsIntf.UpdateOptions.GeneratorName := 'GEN_'+Table_Name;
       CreateTable(false,[tpTable,tpPrimaryKey,tpGenerators,tpTriggers]);
     end;
   finally
     Table.Free;
   end;

Scusate se il codice non sia formattato a dovere.

uesto codice crea una tabella con primary key ed una colonna di testo.

Peccato che nell'inserire il record nel campo di testo,il DBMS non permetta l'inserimento del record nel campo di testo perchè alla primary key manca un valore iniziale.

L'unica connessione che ha al DBMS è il connettore.

Forse dovrei collegare il dataset affinchè venga assegnato un valore iniziale alla PK.

29 Risposte

  • Re: Creazione nuova tabella con FireDAC

    11/04/2024 - GrandfatherCoder ha scritto:


    Peccato che nell'inserire il record nel campo di testo,il DBMS non permetta l'inserimento del record nel campo di testo perchè alla primary key manca un valore iniziale.

    Se l'errore è legato al fatto che il campo è nullo, forse dovresti comunque valorizzarlo con un default - tipo uno 0 (zero) - in modo da superare la validazione lato client, e verificare se in fase di inserimento il database provvede a inserire il giusto valore autoincrementale, a prescindere da quello che hai specificato.

    Per completezza, sarebbe utile conoscere

    • quale database stai utilizzando con FireDAC (Firebird, SQL Server, MySQL, SQLite, …)
    • se hai verificato che la struttura del DB sia corretta, ovvero che il campo sia autoincrementale come ci si aspetta, a prescindere dall'inserimento o meno di nuovi record (il che ricondurrebbe alla questione di cui sopra, ossia il tentativo di mettere un default prima di eseguire l'operazione di Post).

    Ciao! :)

  • Re: Creazione nuova tabella con FireDAC

    Grazie per la risposta.

    Sto usando MySQL.

    La struttura del DB sembra corretta fatto sta che uso DBeaver per verificare.

  • Re: Creazione nuova tabella con FireDAC

    11/04/2024 - GrandfatherCoder ha scritto:


    Grazie per la risposta.

    Sto usando MySQL.

    La struttura del DB sembra corretta fatto sta che uso DBeaver per verificare.

    Perché non vai di sql?

    Con quel codice non stai creando una tabella o forse non ho capito cosa intendi creare.

  • Re: Creazione nuova tabella con FireDAC

    11/04/2024 - GrandfatherCoder ha scritto:


    Table: TFDTable;

    Stai definendo l'oggetto ttable (quello che puoi prendere dalla pallette non una tabella nel database.

    11/04/2024 - GrandfatherCoder ha scritto:


    Table := TFDTable.Create(nil); try

    Togli ciò che ha di default l'oggetto tabella

    11/04/2024 - GrandfatherCoder ha scritto:


    with Table do begin Connection := FDConnector; 

    Indichi a quale connessione fare riferimento

    11/04/2024 - GrandfatherCoder ha scritto:


    TableName := Table_Name;

    Assegni il nome della tabella a.cui fare riferimento (si suppone che la tabella.esista) quindi non stai creando una tabella dati all'interno di mysql ma stai facendo quello che potresti fare mettendo nel form un oggetto ttable.

    11/04/2024 - GrandfatherCoder ha scritto:


    FieldDefs.Add('id',ftAutoInc,0,false)

    Questo potrebbe andare bene per paradox…

    Per mysql devi usare un oggetto tquerysql

    Whith myquery do

      Begin

          Connection := FDConnector;

          Bla… bla… settaggi di connessione vari

          Sql.clear;

          Sql.add('CREATE TABLE table_name (

                         column1 datatype,

                         column2 datatype,

                         column3 datatype,

                          .…');

           Sql.execute;

        End;

    Lanci solo una volta (a meno che non metti una sql if not exist bla bla…)

    Definita la tabella e.creata puoi attaccare l'oggetto ttable alla tabella creata.

    Ora puoi inserire i dati

    Salvo errori di fretta o digitazione.

  • Re: Creazione nuova tabella con FireDAC

    Mi ssto spiegato male.

    Il pproblema è che MySQL è ssolo il primo dbms che sto testando,ma l'applicazione vuole essere universale.

    Volevo evitare di udare i cdomandi SQL per ragioni di uuniversalità.

    Magari avessi usato solo MYSQL ed usufruito del tuo esempio.

    L'esempio mio tra l'altro l'ho preso dal web.

    Quell'oggetto TFDTable mette dubbi aanche a me.

  • Re: Creazione nuova tabella con FireDAC

    12/04/2024 - GrandfatherCoder ha scritto:


    L'esempio mio tra l'altro l'ho preso dal web.

    Credo sia presente anche negli esempi di delphi con sysdb (o qualcosa del genere). Per questo ho scritto che poteva andare bene con paradox.

    Se vuoi creare un programma universale (ti suggerisco al massimo 3 db), usa direttamente gli oggetti a disposizione e li setti da un fle di configurazione dando preferenza all'uso di sql.

    Ti facilita l'assistenza nel caso di modifiche di sql senza rilasciare un nuovo exe.

    I componenti Possibilmente messi su un datamoule.

    Se usi mysql crei una directory con i files di configurazione (magari chiamata mysqlsetup) con:

    Connessione, istuzioni sql ecc..

    Così, che sia fibird, mysql, sql server o altro usi sempre comandi sql. Cambi solo il percorso dove attingere a connessione e query. (Abbastanza mcchinoso se non hai le idee chiare di cosa fare)

    In un esempio si fa uso sia di un componente query sia di un componente table con un radiobutton per selezionare sql o table proprio perché i db non sono tutti uguali.

    Comunque opterei per un solo db.

    N.b. il ile di configurazione devi crittografarlo per ovvi motivi. 

  • Re: Creazione nuova tabella con FireDAC

    https://www.componentace.com/indexes-delphi.htm

    https://stackoverflow.com/questions/52289162/create-a-table-with-an-autoinc-field-using-firedac-tfdtable

    ti perderesti solo di casa…

    studia sql che con questo puoi interagire con molti db scrivendo solo sql.

    il resto è solo visualizzazione in un form.

  • Re: Creazione nuova tabella con FireDAC

    11/04/2024 - GrandfatherCoder ha scritto:


    La struttura del DB sembra corretta fatto sta che uso DBeaver per verificare.

    Ti sembra corretta anche per quanto riguarda il campo autoincrementale?
    Se la risposta è sì, allora non vedo il problema: FireDAC ha fatto esattamente quanto gli hai chiesto in termini di struttura.

    Prova ad assegnare un valore predefinito al campo autoincrementale, solo per sopperire al requisito che non può essere NULL, e verifica cosa ottieni.

  • Re: Creazione nuova tabella con FireDAC

    Scusate il ritardo con cui rispondo.

    @Andrea e @Alka,vi ringrazio innanzi tutto  per i consigli ed il supporto.

    @Andrea,ho preso l'esempio proprio dal link che hai postato che è questo:

    https://stackoverflow.com/questions/52289162/create-a-table-with-an-autoinc-field-using-firedac-tfdtable

    Ho riflettuto sul consiglio che l'universalità non deve essere estesa ad ogni DBMS esistente,ma può andare bene una compatibilità verso 3 o 4,anche perchè le loro architetture sembrano simili,ma tendano via via a differenziarsi.

    Non volevo usare SQL temendo che i vari dialetti potessero costituire una barriera.

    Inizierò a lavorare prendendo spunto dagli ultimi post,se posso me li stampo.

    Volevo realizzare un applicativo che fosse un semplicissimo gestore di DBMS universale(una sorta di versione elementare di DBeaver) per catturare l'attenzione del datore di un'azienda.

  • Re: Creazione nuova tabella con FireDAC

    12/04/2024 - Alka ha scritto:


    11/04/2024 - GrandfatherCoder ha scritto:


    La struttura del DB sembra corretta fatto sta che uso DBeaver per verificare.

    Ti sembra corretta anche per quanto riguarda il campo autoincrementale?
    Se la risposta è sì, allora non vedo il problema: FireDAC ha fatto esattamente quanto gli hai chiesto in termini di struttura.

    Prova ad assegnare un valore predefinito al campo autoincrementale, solo per sopperire al requisito che non può essere NULL, e verifica cosa ottieni.

    Alla fine  è proprio questo il problema: FireDAC lavora egregiamente,manca solo configurare il valore del campo autoincrementale.

  • Re: Creazione nuova tabella con FireDAC

    15/04/2024 - GrandfatherCoder ha scritto:


    Alla fine  è proprio questo il problema: FireDAC lavora egregiamente,manca solo configurare il valore del campo autoincrementale.

    Non ho capito… quindi sei riuscito oppure no?
    In caso negativo, hai provato le soluzioni proposte sopra?

  • Re: Creazione nuova tabella con FireDAC

    15/04/2024 - Alka ha scritto:


    15/04/2024 - GrandfatherCoder ha scritto:


    Alla fine  è proprio questo il problema: FireDAC lavora egregiamente,manca solo configurare il valore del campo autoincrementale.

    Non ho capito… quindi sei riuscito oppure no?
    In caso negativo, hai provato le soluzioni proposte sopra?

    La soluzione suggerita in SQL funziona alla grande.

    La creazione di una tabella tramite TFDTable, mi crea tutto,ma durante il primo inserimento,il solito messaggio d'errore mi informa che la pk non ha un valore iniziale.

    Per il resto,forse devo aprire un altro post per un altro problema: FireDAC non riesce ad accedere a Postgresql perchè mi cerca la libreria libpq.dll.

    Con ZeosLib sembrava tutto più semplice.

  • Re: Creazione nuova tabella con FireDAC

    Zeoslib ragiona in un altro modo e soprattutto nasce per mysql. FireDac non ha neanche il wizhard per mysql e devi impostare tutto a mano o da un file di configurazione (crittografato ovviamente).

    per le librerie, sembra un suono strano, ma sarebbero i driver del database. uso la parola driver per far capire che come per un componente devi dire al s.o. come funziona quel componente, anche per i database devi istruire come ragiona quel database. di solito li trovi nella cartella del database. Il percorso appartiene a quel file di configurazione di cui parlavo in principio nel caso di setup da scegliere con piu database (solo in fase di installazione perchè non ha senso usare piu' db in un programma).

    anche zeos comunque vuole il percorso della libreria del db.

    per il resto, come detto prima, la procedura non sql va bene per dbase paradox e qualche altro… sql va per tutti (o quasi…).

    p.s. una volta configurato l'accesso a mysql da firedac, per me, funziona meglio di zeos.

  • Re: Creazione nuova tabella con FireDAC

    17/04/2024 - GrandfatherCoder ha scritto:


    La creazione di una tabella tramite TFDTable, mi crea tutto,ma durante il primo inserimento,il solito messaggio d'errore mi informa che la pk non ha un valore iniziale.

    Questo non è un problema di creazione della tabella, ma di inserimento del record: se un valore deve essere specificato perché la chiave è NOT NULL, va specificato comunque, a prescindere che la tabella sia stata creata in un modo o nell'altro.

    17/04/2024 - GrandfatherCoder ha scritto:


    Per il resto,forse devo aprire un altro post per un altro problema: FireDAC non riesce ad accedere a Postgresql perchè mi cerca la libreria libpq.dll.

    Quella è la libreria client di PostgreSQL: FireDAC la usa per connettersi al database.

    17/04/2024 - GrandfatherCoder ha scritto:


    Con ZeosLib sembrava tutto più semplice.

    Dipende da come si è abituati a lavorare, ad ogni modo la libreria client mi risulta che serva in tutti i casi, ossia con FireDAC, ZeosLib, dbExpress e così via…

Devi accedere o registrarti per scrivere nel forum
29 risposte