Autore Topic: nuovo record  (Letto 2098 volte)

g.paolo

  • Visitatore
nuovo record
« il: 05 Marzo 2008, 14:08:38 »
Ogni cosa nuova che cerco di introdurre nel mio codice mi sta creando un sacco di problemi, e ve ne sarete accorti!
Ora sono alle prese con l'aggiunta di un nuovo record vuoto per il quale memorizzo solo il nuovo ID.
Quale comando SQL usare?
Ho provato con:
 risultato = connessione.Exec("insert into agenti values(' id ',posizione)")
e diverse altre varianti sintattiche, ma senza successo.
Cercando di seguire la guida che trovo in
http://www.sqlite.org/lang.html
non ottengo altre indicazioni in merito, quindi sto proprio brancolando nel buio.
Ho praticamente "consumato" Google per cercare qualche altra info sulla corretta sintassi e metodo da usare, ma il risultato è sempre molto deludente.
Mi sapete indicare qualche link dove trovare i giusti lumi?

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: nuovo record
« Risposta #1 il: 05 Marzo 2008, 15:56:29 »
Visita il mio sito personale: http://www.leonardomiliani.com

g.paolo

  • Visitatore
Re: nuovo record
« Risposta #2 il: 05 Marzo 2008, 18:50:41 »
Avevo infatti gia letto quel topic, ma l'unico punto in cui si parla di aggiungere un record è in questo codice:

Codice: [Seleziona]
PUBLIC FUNCTION EseguiSql(mysql AS String) AS Result
 'LETTURA TABELLA MyResult = MySqlite.EseguiSql("select * FROM test")
 'NUOVO RECORD MyResult = MySqlite.EseguiSql("INSERT into test (id) values (555)"  
 'AGGIORNO RECORD MyResult = MySqlite.EseguiSql("UPDATE test valore1=12 WHERE id=1")
  RETURN conn.Exec(mysql)    
END


Dove non si fa alcun riferimento all'oggetto "MySqlite" che non è certo l'oggetto connessione!
Se provo ad eseguirlo ovviamente mi da errore!

g.paolo

  • Visitatore
Re: nuovo record
« Risposta #3 il: 05 Marzo 2008, 19:30:55 »
Forse ho capito l'arcano..... ma quanto sono ignorante!
Quello che ritenevo un'oggetto, cioe "MySqlite" forse altro non è che un modulo del programma dell'amico!
Infatti se provo a dare il comando in questo modo:

Codice: [Seleziona]
Risultato = connessione.Exec(com_select)
'dove com_select contiene la stringa:
"INSERT into agenti (id_age) values (" & Trim(Str(posizione)) & ")"


Mi aggiunge sempre un nuovo record con il numero in progressione.
Quello che mi resta da capire ora è il perchè del successivo messaggio di errore:
"Result is not available"

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: nuovo record
« Risposta #4 il: 05 Marzo 2008, 23:15:19 »
Usa il metodo Create() dell'oggetto Connection, scusa. In questo modo fai fare tutto lo "sporco lavoro" a Gambas.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: nuovo record
« Risposta #5 il: 06 Marzo 2008, 00:16:40 »
Ti ricordo che per i comandi sql: INSERT e UPDATE, non sono previsti ritorni, in nessun tipo di database.
L'unico comando sql che ritorna dati è: SELECT, che può leggere dati da una tabella o vista, oppure il ritorno da una stored-procedure.
Più che Gambas, dovresti leggerti qualche manuale SQL (meglio se lo standard SQL-92); sqlite utilizza questo standard, che ormai è lo standard di fatto di tutti i motori RDBMS.

g.paolo

  • Visitatore
Re: nuovo record
« Risposta #6 il: 06 Marzo 2008, 08:43:15 »
Ma ci sono differenze nella sintassi dei comandi SQL fra PostgreSql, MySql ed Sqlite3?
Ho qui un vecchio manuale SQL ma ho il dubbio che ci siano differenze sintattiche tra una versione e l'altra.

g.paolo

  • Visitatore
Re: nuovo record
« Risposta #7 il: 06 Marzo 2008, 08:56:16 »
@leo72
Citazione
Usa il metodo Create() dell'oggetto Connection, scusa. In questo modo fai fare tutto lo "sporco lavoro" a Gambas.


La cosa non mi è molto chiara! Se vado a cercarmi la sintassi di create, mi ritrovo la seguente sintassi:
Codice: [Seleziona]
FUNCTION Create ( Table AS String ) AS Result


Ma io la table ce l'ho già, quindi come diavolo uso sto comando per aggiungere un semplice record?
Se esiste un'altro impiego della funzione, perchè non è riportata nella guida?

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: nuovo record
« Risposta #8 il: 06 Marzo 2008, 17:34:59 »
SQLite3 è compatibile con la sintassi SQL, ma ne omette alcune caratteristiche come ne utilizza di proprie:
http://www.sqlite.org/lang.html

Per quanto riguarda il metodo Create(), la documentazione che hai citato nella sola parte relativa alla sintassi dice:
Citazione

Returns a read/write Result object used for creating records in the specified table.

Che tradotto sta a:
Citazione

Restituisce un oggetto Result leggibile/scrivibile usato per creare record nella tabella specificata

Quindi è ciò che fa al caso nostro.

Ecco un esempio di codice:
Codice: [Seleziona]


PRIVATE SUB Crea_tabella()
DIM Connessione AS NEW Connection
DIM Risultato AS Result

  '-- connetti al database
  Connessione.Name = Application.Path & "/nome_db"
  Connessione.Type = "sqlite3"
  Connessione.OPEN

  '-- salvataggio nuovi dati
  Risultato = Connessione.Create("nome_tabella")
  Risultato["campo_1"] = dato_1
  Risultato["campo_2"] = dato_2
  ...
  Risultato["campo_n"] = dato_n
  Connessione.Commit
  Connessione.CLOSE
END
Visita il mio sito personale: http://www.leonardomiliani.com

g.paolo

  • Visitatore
Re: nuovo record
« Risposta #9 il: 06 Marzo 2008, 18:50:11 »
Avevo compreso che la riga:

Codice: [Seleziona]
Risultato = Connessione.Create("nome_tabella")


creasse in realtà la table, e le successive:

Codice: [Seleziona]
  Risultato["campo_1"] = dato_1
  Risultato["campo_2"] = dato_2


inserissero nella nuova table le colonne dei campi dato_1 e dato_2

Vedi cosa vuol dire l'ignoranza?

Ed ora sto trovando un'altra difficoltà con gli esempi per la cancellazione di un record:

Codice: [Seleziona]
 WITH connessione
      .Begin
        result = .Delete("agenti", criterio, parametro)    
        risultato.Update
      .Commit
    END WITH


che mi da l'errore incomprensibile: "wanted result, got void instead"
Mentre nella guida il comando exec riporta un esempio, questo non esiste per il comando delete.
Come fare? Ti prego, porta pazienza!!!

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: nuovo record
« Risposta #10 il: 07 Marzo 2008, 00:11:21 »
Intanto nel tuo spezzone di codice c'è un'altro errore di scrittura:

        result = .Delete("agenti", criterio, parametro)    
        risultato.Update

prima usi "result" per leggere il Delete, e poi usi "risultato" per aggiornare...
Se leggi l'Help, la funzione Delete è una SUB, e quindi non ritorna nulla; Update  fà parte dell'oggetto Table, e nel tuo caso non può essere utilizzata, prova ad usare Commit (o Rollback) dello stesso oggetto Connection.

Inoltre, come ha specificato leo, ogni database si basa sullo standard SQL, ma alcuni non hanno il set di istruzioni completo; altri, addirittura, aggiungono ulteriori funzionalità. Ma a parte questo, le scelte possono essere due: o usi i comandi SQL con le apposite funzioni, oppure utilizzi gli oggeti di Gambas; ti consiglio di non fare un fritto misto, altrimenti ti perdi...
E ancora: come ho scritto, il DELETE non ritorna nulla, a meno che non accada un errore grave (esempio manca la tabella...); in alcuni database c'è la possibilità di avere come ritorno il numero di record effettivamente scritti, ma non credo che sqlite abbia implementato questa caratteristica.

g.paolo

  • Visitatore
Re: nuovo record
« Risposta #11 il: 07 Marzo 2008, 08:23:52 »
Mi hai chiarito il concetto e ti ringrazio, ho risolto il problema.
Il fatto di aver usato per anni Access, mi ha fossilizzato il cervello!
Ho tolto il result e la riga update

........
.Delete("agenti", criterio, parametro)
conn.commit
........

ed ora funziona.