Italian Problema con Sql! Aiuto!!

mauri74doc

Member
Licensed User
Longtime User
Ciao! ho un problema. Ho una funzione in cui eseguo questo codice

Dim DBCursor As Cursor
Dim DBSql As SQL

DBSql.Initialize(tDir,"database",True)

DBCursor = DBSql.ExecQuery("SELECT DISTINCT categoria FROM argomenti")
If DBCursor.RowCount >1 Then
Dim elenco(DBCursor.RowCount) As String
For x=0 To DBCursor.RowCount - 1
DBCursor.Position=x
elenco(x)= DBCursor.GetString("categoria")
Next

cmd_entra.Text=DBCursor.RowCount

nell'ultima riga verifico che il numero di record letti dalla query corrisponda a quelli del database che qui allego.
quando faccio il debug mi restituisce sempre il valore di 4 record trovati anzichè quelli effettivamente presenti nel mio db come potete vedere. come posso risolvere questo problema?
 

Attachments

  • database.zip
    555 bytes · Views: 204

maxware

Well-Known Member
Licensed User
Longtime User
Ciao Mauri
Vedo nel Db che la query ritorna 5 record + uno a null
Prova a mettere il campo in una listview e vedere quanti record ti torna
Es.
For x=0 To DBCursor.RowCount - 1
DBCursor.Position=x
listview.AddSingleLine(DBCursor.GetString("categoria"))
Next
A spanne nel tuo codice non vedo nulla di strano ( non ho il tablet con me e quindi non ho fatto la prova del codice )
Ciaooooooo
Mamo
 

timo

Active Member
Licensed User
Longtime User
Se scrivi
"If DBCursor.RowCount >1 Then..."
significa "se la tabella contiene più di 2 records..."
e non so se è quello che volevi.

Ti posto un esempio,se ti puo' servire, di mio codice (non gestisce un array; popola solo uno spinner rec per rec e ritorna alla procedura che la chiama
il numero di records presenti (il DB lo apro in _Create e SQL1/TDir li dichiaro in _Process):

B4X:
Sub Activity_Create(FirstTime As Boolean)

If FirstTime Then
   
   'se non esiste gia' lo copio (sulla sd o internal): serve per non sovrascrivere il DB quando aggiorno solo il prg.
        '"exil.db" e' un database senza records costruito esternamente e messo nella cartella "files" (Assets).
   TDir =   DBUtils.CopyDBFromAssets ("exil.db") 'TDir e' Process Global
   SQL1.Initialize(TDir, "exil.db", False)'lasciare false
   
End If

'......ecc.


B4X:
Sub popolaSpinner()As Int

Dim TCursor As Cursor
Dim NumRows,i As Int

TCursor = SQL1.ExecQuery("SELECT titolobrano FROM datibrano ORDER BY titolobrano ASC")
NumRows=TCursor.RowCount


If NumRows > 0 Then

   For i = 0 To TCursor.RowCount - 1
       TCursor.Position = i
       SpinnerCourse.Add(TCursor.GetString("titolobrano"))
   Next
      
   TCursor.Close   
Else
   ToastMessageShow("Nessun brano in memoria.",False)
   TCursor.Close
      
End If

'ritorna al chiamante il no. di records:
Return NumRows

End Sub

estratto da DBUtils (chiamata da _Create):

B4X:
Sub CopyDBFromAssets (FileName As String) As String
   Dim TargetDir As String
   If File.ExternalWritable Then TargetDir = File.DirDefaultExternal Else TargetDir = File.DirInternal
   If File.Exists(TargetDir, FileName) = False Then
         File.Copy(File.DirAssets, FileName, TargetDir, FileName)
   End If
   Return TargetDir
End Sub
 
Last edited:

arenaluigi

Well-Known Member
Licensed User
Longtime User
Ciao Maury74,
ma ti avevo mandato via email il codice rivisto e corretto sia per quanto riguarda la riapertura ogni volta del database, sia per il conteggio dei record count, che per la copia del database.:D
Ma non andavano bene ? fammi sapere :sign0098:
 

marco.canta

Active Member
Licensed User
Longtime User
Ciao Ragazzi, sto facendo qualche programmino per capire bene come funzionano le procedure di SQL ...

per popolare una LISTVIEW, ho usato anche io una procedura come l'esempio di MAXWARE e funziona senza alcun problema

B4X:
Sub ListRecord
   dbCursor =dbSQL.ExecQuery("SELECT * FROM Anagrafico")
      
   ListView1.AddSingleLine("Cliente" & " - " & "Destinazione")
   For i = 0 To dbCursor.RowCount - 1
      dbCursor.Position = i
      ListView1.AddSingleLine(dbCursor.GetString("Cliente") & " - " & dbCursor.GetString("Destinazione"))
   Next
   
   dbCursor.Close
End Sub


Io invece ho qualche problemino sulla copia del file database.
Nel PC ho un file miodb.db con 300 record, lo allego al progetto Basic4 e quando lo vado ad aprire nel tablet risulta vuoto .... cosa sbaglio ??

B4X:
Sub Activity_Create(FirstTime As Boolean)
   Activity.LoadLayout("Database")
   
   If File.Exists(File.DirInternal,"miodb.db") = False Then
      File.Copy(File.DirAssets,"miodb.db",File.DirInternal,"miodb.db")
   End If

   If dbSQL.IsInitialized = False Then
      dbSQL.Initialize(File.DirInternal, "miodb.db", False)
   End If

   ListRecord
End Sub

Grazie !!
 

marco.canta

Active Member
Licensed User
Longtime User
Risolto :) :)

ho sostituito "DirInternal" con "DirRootExternal"

e ora legge il file che ho allegato !!!!
 

mauri74doc

Member
Licensed User
Longtime User
Ciao Luigi
si i file che avevi inviato funzionano. =)
Quest post in effetti è aperto da alcune settimane ma i problemi segnalati qui ormai sono stati superati anche grazie al tuo aiuto!
Pian piano sta nascendo questa piccola app !!
 
Top