Autore Topic: Tabella di DB.SQLite3 vuota  (Letto 2426 volte)

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #15 il: 23 Febbraio 2010, 13:05:19 »
Citazione
Inserisci citazione
L'errore dovrebbe essere qui:
Codice:

.Host = FMain.DB_path


SQLite è un DB locale, non puoi impostargli la proprietà Host: quella è riservata a DB che girano su server quali MySQL o PostGre.
Per indicare il nome del file che contiene il DB devi usare la proprietà Name. Quindi.
Codice:

.Name = FMain.DB_path


In pratica, quindi, non ti apre il DB perché non lo trova.

veramente sqlite 3 accetta come host il percorso dove si trova il db e come name il nome oppure volendo si può definire solamente il nome comprensivo del percorso,
in entrambi i casi il db funziona correttamente

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #16 il: 23 Febbraio 2010, 14:37:59 »
non utilizzare la connessione come variabile globale ma inizializzarla in ogni funzione.
1) se in qualche parte del codice in una funzione ti sei dimenticato di chiudere il db questo viene chiuso automaticamente alla chiusura della funzione
Quindi tui dici di dichiarala all'interno di ciascuna SUB così:
Codice: [Seleziona]
DIM DB_Connection AS NEW Connection 
in modo tale ogni uscita da una sub qualsiasi, a chiudere il DB, eventualmente dimenticato aperto, ci pensa automaticamente Gambas.
Spero di avere capito e procedo così. Vi farò sapere.
Ciao :)
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #17 il: 23 Febbraio 2010, 20:37:34 »
si esatto la dichiari all' interno della sub  :)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #18 il: 24 Febbraio 2010, 00:16:06 »
È successo quello che immaginavo, cioè non è cambiato niente, o quasi: Infatti l'errore che mi dava e che mi da non fa pensare ad un close non eseguita, bensì ad una open mancante. Il messaggio di ERRORE è cambiato ed è cambiato pure il punto dove si manfesta:
Citazione
Unable to commit transaction: The database file is locked
Ecco il codice della Form2.class modificato
Codice: [Seleziona]
PUBLIC SUB MovDigOk_Click()
DIM DB_Connection AS NEW Connection   'inizializza la nuova connessione

DIM b_nupro AS Byte
DIM f_ImpMov AS Float


DIM i_Som AS Integer
DIM i_CoVoContab AS Integer
DIM i_data AS Integer
DIM i_ImpMov AS Integer
DIM i_orario AS Integer
DIM i_RgGriMov AS Integer

DIM $_Benef AS String
DIM $_Como AS String
DIM $_Data AS String
DIM $_Descr AS String
DIM $_GG AS String
DIM $_MM AS String
DIM $_AA AS String
DIM $_orario AS String
DIM $_ora AS String
DIM $_minuti AS String
DIM $_secondi AS String
DIM $_Moneta AS String
  WITH
      DB_Connection
      .Type = "sqlite3"
      .Host = FMain.DB_path
      .Name = FMain.DBname
      .OPEN    'Apro il DB
  END WITH
  IF $_DescrUlt <> "" THEN
      $_TabNewDescr.Add($_DescrUlt)     
      $_DescrUlt = ""         
  ENDIF
  IF ImpMovDig.Text = "" THEN
     ImpMovDig.SetFocus
  ELSE
    IF DescrMovDig.Text = "" THEN
        DescrMovDig.SetFocus
    ELSE 
      IF SegnoEU.Text = "" THEN
          SegnoEU.SetFocus
        ELSE
          i_RgGriMov = 0
          DO UNTIL GriMovv[i_RgGriMov, 1].text = "" 
            INC i_RgGriMov
            IF i_RgGriMov > GriMovv.Rows.count THEN
                BREAK
            ENDIF
          LOOP
          SELECT CASE SegnoEU.Text
                  CASE "E", "U"   
                    GriMovv[i_RgGriMov, 1].text = VoContMoDig.Text
                    GriMovv[i_RgGriMov, 5].text = BenefMovG.Text
                  CASE ELSE         
                    GriMovv[i_RgGriMov, 1].text = CreDebMovG.text
          END SELECT
          GriMovv[i_RgGriMov, 2].text = DescrMovDig.Text
          '$_StriMia = Modulivari.LevEditing($_StriMia)
          $_Como = ModuliVari.LevEditing(ImpMovDig.Text)
          i_Posiz = InStr($_Como, ",")
          IF i_Posiz <> 0 THEN
            $_Como = Left($_Como, i_Posiz - 1) & "." & Right($_Como, 2)
          ENDIF
          f_ImpMov = CFloat($_Como)
          SELECT CASE SegnoEU.Text
                  CASE "E", "D"
                    GriMovv[i_RgGriMov, 3].text = ImpMovDig.Text
                    i_TotEntrate += i_ImpMov
                  CASE ELSE 
                    GriMovv[i_RgGriMov, 4].text = ImpMovDig.Text
                    i_TotUscite += i_ImpMov
          END SELECT
          '---------------------------- rilevo il codice di Voce contabile dalla Tabella piancont ---------------------------------------
          i_Posiz = RInStr(VoContMoDig.Text, " » ") + 3           
          i_LuFix = Len(VoContMoDig.Text) - i_Posiz           
          PRINT "«" & VoContMoDig.Text & "»"
          PRINT Len(VoContMoDig.Text)
          PRINT "«" & Left(VoContMoDig.Text, 17) & "»"
          PRINT "«" & Right(VoContMoDig.Text, i_LuFix) & "»"
          $_VoceConto = Right(VoContMoDig.Text, i_LuFix)
          DB_Connection.Begin
          TRY RecTab = DB_Connection.EXEC("SELECT * FROM piancont WHERE NomeVoce  LIKE '%" & $_VoceConto & "%'")
          IF ERROR THEN
              Message.ERROR("Attenzione! ->  " & ERROR.Text & Chr(10) & Chr(10) & "durante la lettura della Tabella ContabFam.db!piancont'" & Chr(10) & Chr(10) & " il programma verrà chiuso")       
              FMain.Close
          ENDIF
          i_CoVoContab = RecTab!NumVoce                               
          i_data = Val(ModuliVari.$_DataCont)
'--------
'--------------------------------------- routinetta di conversione dell'orario corrente in hhmmss (2 crt per ciascun sottocampo
          $_ora = Hour(Now)
          IF Len($_ora) = 1 THEN $_ora = "0" & $_ora
          $_minuti = Minute(Now)
          IF Len($_minuti) = 1 THEN $_minuti = "0" & $_minuti
          $_secondi = Second(Now)
          IF Len($_secondi) = 1 THEN $_secondi = "0" & $_secondi
          $_Data = $_AA & $_MM & $_GG
          $_orario = $_ora & $_minuti & $_secondi
          i_orario = Val($_orario)                       
          b_nupro = CByte(GriMovv[i_RgGriMov, 0].text)       
          SELECT CASE SegnoEU.Text
                  CASE "U", "A"
                    f_ImpMov = f_ImpMov * (-1)   
          i_Totel = BenefMovG.Count
          FOR i_Som = 0 TO i_Totel - 1
            IF BenefMovG.List[i_Som] = BenefMovG.Text THEN
                $_Benef = Str(i_Som + 1)                 
                BREAK
            ENDIF
          NEXT
'---------------------------------------------------------------------------------------------------------------------------------------
'--------
          $_Descr = DescrMovDig.Text
          $_Moneta = ModuliVari.$_TipoValuta
          TRY DB_Connection.EXEC("INSERT INTO movimgg VALUES(" & i_data & ", '" & i_orario & "', '" & b_nupro & "', '" & i_CoVoContab & "', '" & $_Descr & "', '" & $_Moneta & "', '" & f_ImpMov & "', '" & $_Benef & "')")         '»»  Istruzione superata come se fosse stata eseguita bene
        IF ERROR THEN
            Message.ERROR("Attenzione! ->  " & ERROR.Text & Chr(10) & Chr(10) & "durante l'inserimento record nella Tabella ContabFam.db!movimgg'" & Chr(10) & Chr(10) & " il programma verrà chiuso")       
            FMain.Close
        ELSE
          DB_Connection.Commit            '»»  Istruzione dove si manifesta l'errore
        ENDIF
          ME.ResetAreaDigMov()
      ENDIF
    ENDIF
  ENDIF
END

Come puoi vedere non esiste alcuna close, eppure, sempre più stranamente , la "INSERT INTO movimgg" non produce errore, ma lo produce la "Commit", come se fra la "Insert" e la "Commit" ci fosse una "CLOSE"
Io non so più che cosa fare ..... :'(
Mi resta da provare una cosa sola: svuotatre tutta la Form2.class delle istruzioni presenti; poi rimetterle piano piano tutte, partendo da valori precostituiti e dalle sole "INSERT INTO" e "COMMIT". Se questa non dovesse funzionare, posso solo prendere l'aliscafo per Marettimo e buttare tutto il prgramma in alto mare! ... Sig! sig!
Ciao a tutti.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #19 il: 24 Febbraio 2010, 08:22:54 »
togli il connection.begin, lascia solo l' open , fai la tua lettura, quando hai finito di leggere tutti i dati prova a dare un close e poi prima di inserire la tabella dai un open, cerca di racchiudere operazioni di diverso genere su un db tra un open e un close, se modifichi la struttura o i dati devi dare anche un commit e in alcuni casi anche ub update del result

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #20 il: 24 Febbraio 2010, 10:26:11 »
togli il connection.begin, lascia solo l' open , fai la tua lettura, quando hai finito di leggere tutti i dati prova a dare un close e poi prima di inserire la tabella dai un open, cerca di racchiudere operazioni di diverso genere su un db tra un open e un close, se modifichi la struttura o i dati devi dare anche un commit e in alcuni casi anche ub update del result
Ho fatto tutto come mi hai detto ed è tornato l' errore sull'istruzione "INSERT INTO":
Citazione
Query failed: the database file is locked
Ho  allora posto prima di quell'istruzione un'istruzione di test sulla tabella:
Codice: [Seleziona]
 IF NOT DB_Connection.Tables.Exist("movimgg") THEN      ' Verifica l'esistenza della Tabella "PIanCont"
              Message.ERROR("Attenzione! ->  ERRORE" & Chr(10) & Chr(10) & " '" & ERROR.Text & "'" & Chr(10) & Chr(10) & "La Tabella ContabFam.db!movimgg' è inesistente")       
          ENDIF
Ebbene il risultato non è cambiato; il programma esegue il test senza dare errore e poi da errore sempre alla stessa istruzione:
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO movimgg VALUES(" & i_data & ", '" & i_orario & "', '" & b_nupro & "', '" & i_CoVoContab & "', '" & $_Descr & "', '" & $_Moneta & "', '" & f_ImpMov & "', '" & $_Benef & "')")
Sicuramente il problema à lì dentro, ma come superare l'ostacolo?
Come avrai visto in qualche post precedente e nel sorgente che ti ho fatto pervenire, le colonne riportate nell'INSERT sono tutte quelle della tabella.
Secondo te quell'istruzione è scritta bene? Io non so più cosa fare....... :'( :'( :'(
Ciao.


:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Tabella di DB.SQLite3 vuota
« Risposta #21 il: 24 Febbraio 2010, 11:56:19 »
Vediamo se l'ho beccato!

Allora... tu inserisci i dati creando una concatenazione di stringhe con il comando &... però penso che ti dia l'errore perché vuoi concatenare ad una stringa un intero, ad esempio i_data, o un byte, ad esempio b_nupro.
Prova a convertirli prima tutti in stringa.
Cioè:
Codice: [Seleziona]
..... VALUES(" & trim(str(i_data)) & ", '" & trim(str(i_orario)) & "', '" & trim(str(b_nupro)) & "......
Visita il mio sito personale: http://www.leonardomiliani.com

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #22 il: 24 Febbraio 2010, 12:19:17 »
io in casi dubbi faccio così:

Citazione

sql="INSERT INTO movimgg VALUES(" & i_data & ", '" & i_orario & "', '" & b_nupro & "', '" & i_CoVoContab & "', '" & $_Descr & "', '" & $_Moneta & "', '" & f_ImpMov & "', '" & $_Benef & "')"

file.save(user.home & "/pippo.txt",sql)
DB_Connection.EXEC(sql)

in questo modo salvo la query in file di testo poi apro il db con sqlitebrowser e provo la query contenuta nel file pippo.txt nel db ottenedo così indicazione di eventuali errori.
se la query funziona il problema è nel codice, posta il programma modificato  con le connection "locali" così riesco a controllarlo meglio

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #23 il: 24 Febbraio 2010, 12:56:00 »
@Leo:
In un programmino che ho allegato in uno dei miei post iniziali (n.4), ho eseguito quella riga di comando, impostata sempre alla stessa maniera, ed ha funzionato meravgliosamente, per cui ho rinunciato a dare spiegazioni sull'anomalia. Ho provato stamani anche a lasciare nella SUB in questione solamente le istruzioni necessarie per inserire il record nella tabella e non ha funzionato nemmeno.   Boooh!!!  :-X

@fsurfing:
Ho fatto anche la prova fresca fresca che mi hai suggerito, ma non è cambiato niente. Rieccoti allegato il programma con le ultime modifiche.
 :-[ :-[
Sono veramente desolato per tutta questa lunga discussione. Vi chiedo scusissime.
Ciao a tutti
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Tabella di DB.SQLite3 vuota
« Risposta #24 il: 24 Febbraio 2010, 15:16:06 »
Scusate ma a me l'errore restituito mi fa pensare ad un file protetto che non viene sbloccato...non è che hai creato il tuo database con dati di login ed orta non li inizializzi mai?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #25 il: 24 Febbraio 2010, 17:38:37 »
OK ora con qualche modifica funziona :)

appena avviato comunque il programma mi dava stakoverflow, ho risolto togliendo tutti i me. presenti nel form2 del resto se tu hai una funzione nel form2 non è il caso che indichi ad esempio il button1 con me.button1, basta button1.
il ME si utilizza soprattutto in relazione alla chiamata di oggetti appartenenti a un gruppo o array di oggetti

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #26 il: 24 Febbraio 2010, 23:56:44 »
OK ora con qualche modifica funziona :)
appena avviato comunque il programma mi dava stakoverflow, ho risolto togliendo tutti i me. presenti nel form2 del resto se tu hai una funzione nel form2 non è il caso che indichi ad esempio il button1 con me.button1, basta button1.
il ME si utilizza soprattutto in relazione alla chiamata di oggetti appartenenti a un gruppo o array di oggetti
Ho visto solo a tarda sera la tua risposta, perchè ho potuto solo ora riappropriarmi della connessione Internet.
Ti ringrazio enormemente per i chiarimenti. Da quello che mi hai detto sembra che tutte le chiamate fatte con ME. abbiano provocato  lo stakoverflow.A me non lo dava perciò non lo avevo segnalato. Tornando al programma, ho visto le correzioni apportate e l'ho eseguito così come me lo hai restituito. Ho trovato il file pippo.txt con la stringa che poi sarebbe dovuta finire anche, come riga, nella tabella movimgg e, purtroppo devo dirti che la tabella rimane vuota. Se tu dici che il programma da te funziona, devo crederci, ma nel mio pc, sotto Gambas 2.19, continua a non funzionare.

Vorrei capire poi una cosa. Il programma non da più errore se viene mantenuto il comando
DB_Connection.Begin    e viene soppresso il comando    DB_Connection.Commit.
Per quello che avevo capito, senza il commit l'INSERT non viene convalidato, però la presenza del commit fa rinascere l'errore.

Tutto ciò mi sembra il cane che vuole mordere la coda. Per riuscirci la bestiola avrebbe bisogno di una coda e di un collo un pò più lunghi. :)

Ciao.
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #27 il: 25 Febbraio 2010, 10:49:01 »
@fsurfing:
Stamattina ho provato a spostare l'INSERT INTO in una nuova classe, ma il risultato, purtroppo non cambia. Ecco l'esito delle prove (ho riportato solo le istruzioni essenziali):
Codice: [Seleziona]
DB_Connection.Type = "sqlite3" 
DB_Connection.Host = FMain.DB_path
DB_Connection.Name = FMain.DBname
DB_Connection.Open   
DB_Connection.Begin
DB_Connection.EXEC(sql)
DB_Connection.CLOSE
Cioè, ripetendo le istruzioni preparate da te (con Begin e senza Commit), il programma procede senza dare errori, ma non registra il record nella tabella.
Codice: [Seleziona]
DB_Connection.Type = "sqlite3" 
DB_Connection.Host = FMain.DB_path
DB_Connection.Name = FMain.DBname
DB_Connection.Open   
DB_Connection.Begin
DB_Connection.EXEC(sql)
DB_Connection.Commit
DB_Connection.CLOSE
Inserendo la Commit provoca Errore di DB chiuso alla Commit.
Codice: [Seleziona]
DB_Connection.Type = "sqlite3" 
DB_Connection.Host = FMain.DB_path
DB_Connection.Name = FMain.DBname
DB_Connection.Open   
DB_Connection.EXEC(sql)
DB_Connection.Commit
DB_Connection.CLOSE
Togliendo la Begin e lasciando la Commit, l'Errore  di DB chiuso lo da già alla .EXEC(sql).

E veramente diventato un percorso senza via d'uscita. Ora provo a trasformare la classe in modulo, anche se con molto scetticismo. Dopo di che, resta solo la possibilità di chiamare un'altro programma o forse una funzione shell. Intanto sono già trascorsi 6 giorni dalla prima manifestazione di errore ed il mio programma è ancora fermo, mentre dovrei essere alle fasi di prova del Form5.class. Però non mi sto lamentando con nessuno di Voi che state cercando di darmi veramente una grossa mano, ma delle stranezze che riscontro. :(
Ciao.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #28 il: 25 Febbraio 2010, 11:32:58 »
la cosa strana è che l' errore dice che il db e loked ovvero la connessione è aperta correttamente ma il db non può essere scritto perchè l' accesso in scrittura è negato , questo succede solitamente se un altra applicazione o processo stanno eseguendo operazioni di scrittura nel db o se non si anno i permessi per scrivere

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Tabella di DB.SQLite3 vuota
« Risposta #29 il: 25 Febbraio 2010, 12:01:50 »
secondo me il problema deriva tutto dalla creazione delle tabelle iniziali che non hanno un indice autoincrementante, altrimenti non si spiegano questi problemi,perchè non utilizzi un indice autoincrementante su un campo id lasciando quest' ultimo come unico indice?
tanto poi l' ordinamento nella visualizzazione lo puoi fare tramite query