Italian Ma come diamine funzionano sti DB?

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Possibile che non riesco ad aggiungere campi in un DB? :eek:
...m sento molto rinco! :oops:

Allora:

Il mio DB non è nulla di chissà cosa... ha solo un campo! ed io non riesco a riempirlo :D

Ecco come sto procedendo (ne ho provate di deverse):


B4X:
Sub WrtRec
    'I dati Cursor, me li porto da una SELECT fatta da Main, e sono pieni
'"nome" è una variabile globale ed è piena
 
Dim Str As String
Dim Found As Int
Found=0
    For i=0 To Cursor.ColumnCount-1
         Str = dbSQL.ExecQuerySingleResult("SELECT campo FROM dati")
    If Cursor.ColumnCount-1>0 Then  msgbox("C'è almeno un campo","DB")
    If Str = txtNome.Text Then
        'Controllo esistenza nme nel campo
        Found=1
    End If
    Next

    If Found=1 Then
        ToastMessageShow("Nome o Nick già esistente!", False)
    Else    
        'se non esiste lo aggiungo
        SQL.ExecNonQuery2("INSERT INTO dati VALUES(?)",Array As String(nome))                
    End If
End Sub


Ecco, questo è un piccolo esempio.
Non mi da nessun errore ma, quando lo passa, NON riempie il DB :(

Dove sbaglio?

Danghe!
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Intanto, non sei rinco. Quando non si conosce una cosa, ci si sente frustrati, ALL'INIZIO!
(se dai un'occhiata alle funzioni del modulo DBUtils, vedrai che impari facilmente).

Nel commento, dici che il Cursor lo hai riempito nel Main, perciò devi solo scorrere i dati che sono "all'interno" (si fà per dire) di questo, non eseguire altre query. Però mi sembra strano che ti abbia accettato Cursor come nome di variabile, nella Main.

Nella Main dovresti avere qualcosa tipo:
Public MyCursor as Cursor
MyCursor = MyDB.ExecQuery("SELECT NomeCampo FROM NomeTabella")

Poi, scorri i dati:
For I = 0 to MyCursor.RowCount - 1
MyCursor.Position = I
Dato = MyCursors.GetString("NomeCampo") - oppure MyCursors.GetString2(IndiceCampo) - nel tuo caso IndiceCampo sarà 0.
Next

La query che hai usato per scrivere dovrebbe andare bene, se la tabella si chiama "dati".
 
Last edited:

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Gasp! :(
E' tutto esatto ma non si riempie! :mad: ...beh! se non si riempie qualcosa c'è e, quindi, non è proprio giusto :D
Controllo e ricontrollo ma niente!
Non è che devo dare un comando al DB per eseguire la query (tipo in PHP il mysql_Query)?

Boh!
Ma se la variabile "nome" è già una String e non ha un Array... non capisco quel comando Array as String(nome)! ...mi complica le cose sta roba :(

Se metto un break in quel punto, vedo che la variabile che vado a passare all'insert ("nome") è piena... ma non accade nulla (sia da programma, che non la trova, sia da SQLLite che da il DB vuoto) :confused:

Non da errori ma non fa nulla!

DB=Mydata
Tabella=dati
Campo=campo
Stringa riempimento=nome

Del fatto che mi abbia accettato Cursor come variabile, infatti, è strano :rolleyes:

Nel Main, faccio oun controllo iniziale se nonvi sono giocatori...altrimenti, chiamo la sub per crearli:


B4X:
Cursor = SQL.ExecQuery("SELECT campo FROM dati")
    If Cursor.ColumnCount-1>0 Then                'Se c'è almeno un Record, significa che esiste già
        For k=0 To Cursor.ColumnCount-1
             Cursor.Position=k
             str=Cursor.GetString("campo")
             nome=Str
        Next
   Else             'Se non esiste nessun giocatore, chiamo la sub per la creazione
     PosPlayer=0
     NewPlay_Click  
End If
 
Last edited:

CyclopDroid

Well-Known Member
Licensed User
Longtime User
....scusate ma non capisco ancora.

Come funziona questa INSERT?

La mia tabella è DATI e il mio campo è CAMPO... come lo riempio?

Ho provato a cambiare inserento al posto di:

SQL.ExecNonQuery2("INSERT INTO dati VALUES(?)",ArrayAsString(nome))

questo.....

B4X:
    SQL.ExecNonQuery("INSERT INTO dati VALUES('" & campo & "')" )


ma... oltre a non ricevere nessn errore, NON fa NULLA!!!:mad::confused::confused:

Come devo riempire questo campo "CAMPO" nella tabella "DATI"?

Ho pure pensato di utilizzare la ExecQuery al posto della ExecNonQuery (pensando che così avrebbe inserito)... ma niente! Ne errori ne inerimenti! :(
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Nel Main, faccio oun controllo iniziale se nonvi sono giocatori...altrimenti, chiamo la sub per crearli:


B4X:
Cursor = SQL.ExecQuery("SELECT campo FROM dati")
    If Cursor.ColumnCount-1>0 Then                'Se c'è almeno un Record, significa che esiste già
        For k=0 To Cursor.ColumnCount-1
             Cursor.Position=k
             str=Cursor.GetString("campo")
             nome=Str
        Next
   Else             'Se non esiste nessun giocatore, chiamo la sub per la creazione
     PosPlayer=0
     NewPlay_Click
End If

Qui tu controlli se il numero dei campi (column) è... etc. E tu hai un solo campo!
Devi controllare il numero di record che la query restituisce: Cursor.RowCount (cioè le righe).

Poi leggi "campo" e lo metti in str, che a sua volta passi a nome: tanto vale scrivere direttamente nome = Cursor.get...
e poi, almeno in questa parte del codice, non utilizzi il nome trovato.
 

LucaMs

Expert
Licensed User
Longtime User
B4X:
    SQL.ExecNonQuery("INSERT INTO dati VALUES('" & campo & "')" )


ma... oltre a non ricevere nessn errore, NON fa NULLA!!!:mad::confused::confused:

Meglio utilizzare la ExecNonQuery2, così non hai problemi di virgolette e altro.

la tua:
SQL.ExecNonQuery2("INSERT INTO dati VALUES(?)", Array As String(nome))

dovrebbe funzionare perché hai un solo campo (ma non ne sono certissimo!).

La funzione deve ricevere un array, per questo sei costretto ad utilizzare Array as.

Normalmente si scrivono anche i nomi dei campi:
INSERT INTO NomeTabella (NomeCampo1, NomeCampo2) VALUES ("Pippo", 5)

Inoltre, ricordati di chiudere il db quando chiudi l'app (almeno)



Tutto questo se preferisci imparare ad utilizzare le query SQL e SQLite, altrimenti fai prima utilizzando DBUtils!

[dimenticavo: ti consiglierei di mettere le tue funzioni che lavorano sul DB in un modulo separato]
 
Last edited:

CyclopDroid

Well-Known Member
Licensed User
Longtime User
....ma cosa cambia fra l'utilizzo di DBUtils e SQLlite? :confused:
Ormai un mio DB è stato fatto con SQLlite.... sono compatibili o è tipo DBAccess VS DBMysql?

Mah! Se entro in SQLLite e creo un campo, metto questo comando urtilizzato in PHP:

INSERT INTO dati (campo) VALUES ("Pippo")

...i dati vengono inseriti.

Ma se lo trasformo in codice:

SQL.ExecNonQuery("INSERT INTO data (campo) VALUES ('" & nome & "')")


... non da errore ma non inserisceNULLA!!! :mad:

Mi sa che passo a DBUtil, sperando che il mio DB lo possa utilizzare :(
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
DBUtil è soltanto un modulo con alcune routine per utilizzare più facilmente SQLite.

Ti può servire per non scrivere da solo e molte volte routine di lettura/scrittura sul DB.

Ad esempio, ha una routine:

ExecuteListView(SQL As SQL, Query As String, StringArgs() As String, Limit As Int, ListView1 As ListView, TwoLines As Boolean)

alla quale passi la tua query, gli eventuali parametri (StringArgs) una listview e te la carica con i dati, senza che tu ti metta a "sfogliare" i dati tramite il cursore.
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Bene, allora mi sa che proverò con questo, per ora ;) ...anche se non riesco proprio a capire perché il mio codice non funziona :(
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
... :D:D:D
Troppo grande :p:D
Dai, vedrò se posso mandarti la parte incriminata,appena possibile ;)
Oggi ho da fare alte cose... fortunatamente non esiste solo questa macchina infernale :D
 

CyclopDroid

Well-Known Member
Licensed User
Longtime User
Rieccomi qua. Alla fine ho deciso di usare un normalissimo file txt per i record :p
Per ora l'ho messo un po da parte, perché voglio realizzare un semplice qidget ma ho problemi.
Apro un nuo trhead per questo.
Mi prendo un po di riposo, per questo gioco, e lo riprenderò in men che non si dica ;)
 
Top