Autore Topic: popolazione tabella DB SQLite3 da programma  (Letto 1939 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
popolazione tabella DB SQLite3 da programma
« il: 25 Giugno 2009, 17:41:34 »
Ho registrato manualmente, con lo strumento Sqliteman una tabella dove avevo definito una "Primary Key Integer". Dopo avere inserito 138 elementi, nelle prove di programma, mi sono accorto che avevo creato, per errore, una colonna non più necessaria. Ho cercato di eliminare la colonna sempre tramite Sqliteman, ma la funzione non era abilitata. Allora ho pensato ad uno stratagemma:

Citazione
1) Ho caricato in memoria una tabella del tipo
Codice: [Seleziona]
DIM TbPiaCont AS String[138, 5]
che ho valorizzato coi valori contenute nelle colonne della Tabella del DB;

2) Ho creato nel DB una nuova tabella con la seguente istruzione:
Codice: [Seleziona]
sql = "CREATE TABLE 'PianCont'  ( 'NumVoce' INTEGER PRIMARY KEY ASC, 'NomeVoce' VARCHAR(50) DEFAULT NULL, 'ContrPartSiNo' CHAR(1) DEFAULT NULL, 'DtPrimoUso' INTEGER DEFAULT NULL )


3) ho popolato la tabella appena creata coi dati salvati prima nell'array di memoria:
Codice: [Seleziona]
WITH 
      DB_Connection
      .Name = DBname
      .OPEN    'Riapro il DB
  END WITH
   DB_Connection.begin
   NomeRec = DB_Connection.CREATE("PianCont")
   i_Conta = 0
    FOR i_Conta = 0 TO i_NumEle
        NomeRec!NumVoce = Val(TbPiaCont[i_Conta, 0])
        NomeRec!NomeVoce = TbPiaCont[i_Conta, 1]
        NomeRec!ContrPartSiNo = TbPiaCont[i_Conta, 2]
        NomeRec.Update
    NEXT
    DB_Connection.Commit
    DB_Connection.CLOSE


Soddisfatto che tutto aveva funzionato sono andato a guardare il DB e la tabella, in particolare, ed ho trovato la grande srpresa :-o

la colonna definita come Prtimary Key era stata valorizzata con una numerazione autoincrementale automatica, mentre avrei dovuto trovarvi il valore trasferitovi con l'istruzione:
 NomeRec!NumVoce = Val(TbPiaCont[i_Conta, 0]).

Non contento ho inserito un "breakpoint" all'istruzione successiva ed ho notato che effettivamente il trasferimento non avviene, viene  invece trasferito "NULL". Ma che significa? :-o  :-?
Non posso far altro che passare la parola agli esperti.  :ciao:
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: popolazione tabella DB SQLite3 da programma
« Risposta #1 il: 26 Giugno 2009, 21:44:03 »
il problema secondo me risiede nella query di creazione della tabella

Codice: [Seleziona]
sql = "CREATE TABLE 'PianCont'  ( 'NumVoce' INTEGER PRIMARY KEY ASC, .......


crea in effetti una primary key autoincrementale

prova con qualcosa del genere:

Codice: [Seleziona]
sql = "CREATE TABLE 'PianCont'  ( 'NumVoce' INTEGER ,'NomeVoce' VARCHAR(50) DEFAUL.....

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: popolazione tabella DB SQLite3 da programma
« Risposta #2 il: 26 Giugno 2009, 23:00:36 »
Citazione

fsurfing ha scritto:
il problema secondo me risiede nella query di creazione della tabella
Codice: [Seleziona]
sql = "CREATE TABLE 'PianCont'  ( 'NumVoce' INTEGER PRIMARY KEY ASC, .......

crea in effetti una primary key autoincrementale
prova con qualcosa del genere:
Codice: [Seleziona]
sql = "CREATE TABLE 'PianCont'  ( 'NumVoce' INTEGER ,'NomeVoce' VARCHAR(50) DEFAUL.....

Per la verità, non riesco a capire: dalla guida "SQLite  SQL Lamguage Syntax Diagrams", in column constraint, si capisce che, per definire la primary key autoincrementale, bisogna  aggiungere il parametro "AUTOINCRENT", cioé:
 
Citazione
"CREATE TABLE 'PianCont'  ( 'NumVoce' INTEGER PRIMARY KEY ASC AUTOINCRENT, .......
, cosa che io non ho fatto; poi mi pare di capire dal tuo suggerimento che dovrei definire una tabella senza primary key. Ho capito bene? :roll:  :ciao:
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: popolazione tabella DB SQLite3 da programma
« Risposta #3 il: 26 Giugno 2009, 23:29:14 »
PRIMARY INTEGER KEY è un tipo speciale che crea un alias per l'indice numerico ROWID che viene usato da SQLite per identificare tutte le righe del DB. Se non gli passi un intero, lui incrementa in automatico quel valore, anche senza AUTOINCREMENT (così si legge sulla documentazione).
Tu usi questa funzione:
Codice: [Seleziona]

NomeRec!NumVoce = Val(TbPiaCont[i_Conta, 0])

Prova cambiando in
Codice: [Seleziona]

NomeRec!NumVoce = Int(TbPiaCont[i_Conta, 0])

Magari, forzando il tipo ad integer, riesci a risolvere.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: popolazione tabella DB SQLite3 da programma
« Risposta #4 il: 27 Giugno 2009, 16:58:35 »
Citazione

leo72 ha scritto:
.......................................
Tu usi questa funzione:
Codice: [Seleziona]

NomeRec!NumVoce = Val(TbPiaCont[i_Conta, 0])

Prova cambiando in
Codice: [Seleziona]

NomeRec!NumVoce = Int(TbPiaCont[i_Conta, 0])

Magari, forzando il tipo ad integer, riesci a risolvere.


Ho provato, ma ho ottenuto un errore, di tutta risposta; allora ho modificato l'istruzione così:
Codice: [Seleziona]
NomeRec!NumVoce = Int(Val(TbPiaCont[i_Conta, 0]))


ed  :evviva: ha funzionato. Però la gioia é durata poco perché dopo avere ricostituito la tabella di DB con tutti i suoi vecchi record, ne ho agguiunto uno con PRIMARY KEY di valore intermedio. Mi aspettavo quindi accedendo nel DB con SQLiteman di scorrere tutti i record in ordine acendente di chiave primaria. Invece quello che ho inserito per ultimo l'ho trovato ultimo. La cosa mi preoccupa alquanto, perché vuol dire che inserendo record in ordine non consecutivio di chiave primaria, tutte le mie tabelle conterranmo dati disordinati.  :cry:

Allora non é sufficiente definuire nella tabella una PRIMARY KEY' Occorre anche indicizzarla? E come? :-(  :ciao:
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: popolazione tabella DB SQLite3 da programma
« Risposta #5 il: 27 Giugno 2009, 20:33:19 »
devi leggerti bene la sintassi sql per la creazione degli indici e poi provarla in sqlite , dico che bisogna provarla perchè sqlite è un "parente povero" di altri db sql ,quindi non tutte le funzioni potrebbero funzionare come ci si aspetta

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: popolazione tabella DB SQLite3 da programma
« Risposta #6 il: 27 Giugno 2009, 23:27:42 »
Io invece leggerei prima la documentazione di SQLite, dato che adotta alle volte implementazioni non conformi ai canoni SQL. Quindi è bene capire prima come funziona questo DB che, come ha giustamente detto fsurfing, è un po' un dio minore.

Per quanto riguarda il problema dell'ordinamento, quello da te vissuto credo sia il comportamento corretto, standard: cioè i dati sono immagazzinati così come sono inseriti (a meno di ricordarmi male). L'unico indice che sarà sempre ordinato è proprio il PRIMARY INTEGER KEY AUTOINCREMENT.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: popolazione tabella DB SQLite3 da programma
« Risposta #7 il: 27 Giugno 2009, 23:43:23 »
guarda anche qui:http://www.sqlite.org/lang_createindex.html

più che giusto meglio leggere la documentazione sqlite... io di solito cerco guide sql perchè si riescono a trovare anche in italiano, mentre la documentazione di sqlite (www.sqlite.org) oltre che essere in inglese io la trovo alquanto criptica :(

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: popolazione tabella DB SQLite3 da programma
« Risposta #8 il: 28 Giugno 2009, 00:13:20 »
Più che criptica è molto stringata, alle volte danno per scontato diversi concetti. Secondo me più che una documentazione è in realtà una patch, vale a dire riporta solo le differenze dalla doc. di SQL :-)
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: popolazione tabella DB SQLite3 da programma
« Risposta #9 il: 04 Luglio 2009, 23:59:37 »
Citazione

fsurfing ha scritto:
guarda anche qui:http://www.sqlite.org/lang_createindex.html


Ho guardato, ho letto, ho cercato di capire; ho attuato quello che ho capito, una due tante volte, con tante prove diverse: ««  Tutte negative. L'indice non funziona e ...  :evil:  penso proprio che non sia possibile gestire un indice diversio dall standard di sqlite3.
Bastaaaaaa!
Ciao a tutti.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: popolazione tabella DB SQLite3 da programma
« Risposta #10 il: 05 Luglio 2009, 00:02:38 »
mi spiace .. se avrò tempo farò delle prove anche io  .)