Autore Topic: La creazione di una tabella sqlite3 non funziona  (Letto 543 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.721
  • Ne mors quidem nos iunget
    • Mostra profilo
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.239
  • Tonno verde
    • Mostra profilo
Re:La creazione di una tabella sqlite3 non funziona
« Risposta #1 il: 05 Agosto 2022, 18:34:39 »
Se ti garba, puoi passare al nostro amico il codice seguente.
Ma occorre precisare che la via corretta è quella scritta da Hans sul Libro https://gambas-buch.de/doku.php?id=start
Questo potrebbe essere un esercizio utile a comprendere le varie fasi che vengono scritte in console.
Inoltre nella cartella Database all'interno del programma troverà il databasetest
Potrà vederlo all'interno della IDE facendo click col tasto destro del mouse su Connessioni ... Nuova connessione dalla finestra sceglie:
Nome: lascia Connection1
Tipo: SQLite
Percorso: Progetto corrente > Database > OK
Database: databasetest > OK

Il codice seguente va copiato e incollato in un modulo (classe di avvio) di un nuovo progetto database:
Codice: [Seleziona]
Private $hConn As New Connection
Private $sNameDB As String = "databasetest"
Private $sPathDB As String = Application.Path &/ "Database"

Public Sub Main()

  CheckDB

End

Private Sub CheckDB()

  db.Debug = True

  If Not Exist($sPathDB) Then Try Mkdir $sPathDB
  With $hConn
    .Close()
    .Type = "sqlite3"
    .Host = $sPathDB
    .Open()
    If Not $hConn.Databases.Exist($sNameDB) Then
      .Databases.Add($sNameDB)
      .Close()
      .Name = $sNameDB
      .Open()
      .Begin()
      MakeTable()
      FillTable()
      .Commit()
      Print ("#Database successfully created!")
    Else
      Print ("#Existing database")
    Endif
    .Close()
  End With

Catch
  $hConn.Rollback()
  Error.Raise(Error.Text & " - " & Error.Code)

End

Private Sub MakeTable()

  Dim hTable As Table

  ' Create the Addresses table
  hTable = $hConn.Tables.Add("taddr")
  hTable.Fields.Add("adkey", db.Serial)
  hTable.Fields.Add("adnam", db.String, 32)
  hTable.Fields.Add("adsur", db.String, 32)
  hTable.Fields.Add("adfem", db.Boolean)
  hTable.Fields.Add("adadd", db.String, 64)
  hTable.Fields.Add("adzip", db.String, 8)
  hTable.Fields.Add("adcit", db.String, 32)
  hTable.Fields.Add("adpro", db.String, 32)
  hTable.Fields.Add("adnot", db.String,, "No note")
  hTable.PrimaryKey = ["adkey"]
  hTable.Update

End

Private Sub FillTable()

  ' Populate the address table with test records.
  ' I apologize for the low adherence to reality.
  Dim i As Integer
  Dim aStreet As String[] = ["St. ", "Ln. ", "Ave. ", "Blvd."]
  Dim aZciPro As String[]
  Dim aFirstName As String[] = ["Binah", "Hanna", "Selassie", "Okpara", "Agustina", "Clema", "Coyan", "Eusebio", "Diego", "Alisha", "Daphne", "Wiley", "Valentine", "Lidwina", "Roxana", "Edmund", "Hildeger", "Adrianne", "Janette", "Quentin", "Sylvain", "Francesco", "Marco", "Aldina", "Ornella", "Carmencita", "Galena", "Florentino", "Rodrigo", "Benoit", "Mario"]
  Dim aLastName As String[] = ["Smith", "Johnson", "Williams", "Brown", "Martin", "Bernard", "Dubois", "Thomas", "Robert", "Richard", "Müller", "Schmidt", "Schneider", "Fischer", "Weber", "Meyer", "Gunnarsson", "García", "González", "Rodríguez", "Fernández", "López", "Martínez", "Jensen", "Nielsen", "Cohen", "Friedman", "Rossi", "Bianchi", "Minisini", "Verdone"]
  Dim hResult As Result

  For i = 0 To 99
    aFirstName.Shuffle()
    aLastName.Shuffle()
    aStreet.Shuffle()

    hResult = $hConn.Create("taddr")
    hResult!adnam = aFirstName[0]
    hResult!adsur = aLastName[0]
    hResult!adfem = Female(aFirstName[0])
    hResult!adadd = aStreet[0] & " " & aLastName[2] & " n. " & (i + 10)
    aZciPro = Zcipro()
    hResult!adzip = aZciPro[2]
    hResult!adcit = aZciPro[0]
    hResult!adpro = aZciPro[1]
    hResult.Update
  Next

End

Private Function Female(name As String) As Boolean

  ' Returns if female is true or false
  If name Ends "a" Then
    If name <> "Okpara" Then
      Return True
    Endif
  Else If name Ends "e" Then
    If name <> "Selassie" Then
      Return True
    Endif
  Endif
  Return False

End

Private Function Zcipro() As String[]
  ' Returns in vectors form: Zip, City, Country in Italian style ;-)

  Dim ss As New String[]
  Dim n As Integer[] = [1, 2, 3, 4, 5, 6, 7, 8, 9]

  n.Shuffle()
  Select n[0]
    Case 1
      ss.Push("New York")
      ss.Push("New York")
      ss.Push("10100")
    Case 2
      ss.Push("Los Angeles")
      ss.Push("California")
      ss.Push("32000")
    Case 3
      ss.Push("Chicago")
      ss.Push("Illinois")
      ss.Push("70100")
    Case 4
      ss.Push("Houston")
      ss.Push("Texas")
      ss.Push("24000")
    Case 5
      ss.Push("Phoenix")
      ss.Push("Arizzona")
      ss.Push("40032")
    Case 6
      ss.Push("Philadelphia")
      ss.Push("Pennsylvania")
      ss.Push("22100")
    Case 7
      ss.Push("San Antonio")
      ss.Push("Texas")
      ss.Push("24100")
    Case 8
      ss.Push("Jacksonville")
      ss.Push("Florida")
      ss.Push("50100")
    Case 9
      ss.Push("Denver")
      ss.Push("Colorado")
      ss.Push("80000")
  End Select
  Return ss

End

« Ultima modifica: 05 Agosto 2022, 18:36:45 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.239
  • Tonno verde
    • Mostra profilo
Re:La creazione di una tabella sqlite3 non funziona
« Risposta #2 il: 09 Agosto 2022, 18:22:58 »
Visto che il mio precedente sforzo non è stato apprezzato, allego il suo codice corretto e commentato sia in italiano che in tedesco.

Codice: [Seleziona]
Private myordner As String
Private mydbname As String
Private $hConn As New Connection

Public Sub Form_Open()

  myordner = "mienimmen"
  mydbname = "mienimmen.sqlite3"

  '' Verzeichnisse erstellen wenn nicht vorhanden. Crea le directory se non sono disponibili
  ' Es gibt bessere Möglichkeiten, dies zu tun siehe Button1_Click. Ci sono modi migliori per farlo vedi Button1_Click
  If Exist("/home/" & user.Name & "/" & myordner) = False Then
    Mkdir "/home/" & user.Name & "/" & myordner
    Print "Verzeichniss '/home/" & user.Name & "/" & myordner & "'  existiert nicht, lege Verzeichniss an."
  Endif

  '' Datenbank anlegen wenn nicht vorhanden Crea il database se non è disponibile
  'Try $hConn.Close

  ' Da Sie With verwenden, können Sie sofort damit beginnen. Visto che usi With parti subito con esso
  With $hConn
    .Close ' Schließt jede offene Verbindung (Try ist überflüssig, die Methode behandelt den Fehler standardmäßig) Chiude un eventuale connessione aperta (Try è superfluo il metodo gestisce l'errore di default)
    .Type = "sqlite3" ' ' wird im Original aus dem Form geholt.
    .Host = "/home/" & user.Name & "/" & myordner ' ohne Dateiname !
    ' Wenn wir eine bereits vorhandene Datenbank in einen Benutzerordner kopieren, ist das eine Sache.
    ' In diesem Fall, dass die Datenbank, wenn sie nicht existiert, erstellt wird, können wir den Namen nicht sofort schreiben, sondern müssen testen
    ' Se copiamo un database già esistente in una cartella dell'utente è un conto.
    ' In questo caso che, se non esiste, il database viene creato, non possiamo scrivere il nome subito ma dobbiamo testare
    ' .Name = ""  ' hier kommt nichts rein, sonst will der Treiber eine vorhandene Datei öffnen -> u.U. Fehler, Datei wurde nicht gefunden. qui non arriva nulla, altrimenti il driver vuole aprire un file esistente -> eventualmente errore, il file non è stato trovato.
   
    ' Zuerst öffnen wir die Verbindung
    .Open
    ' Wir testen und fügen ggf. die Datenbank hinzu. Testiamo e se serve aggiungiamo il database
    If Not .Databases.Exist(mydbname) Then
      .Databases.Add(mydbname)
      ' Schließen der Verbindung. Chiudiamo la connessione
      .Close
      ' Wir öffnen die Verbindung mit der Datenbank mydbname. Apriamo la connessione al database mydbname
      .Name = mydbname
      .Open
      ' Einleiten einer Transaktion. Iniziamo una transazione
      .Begin
      ' Wir erstellen die Tabelle. Creiamo la tabella
      machmatabellen ' le parentesi servono solo se ritorna dati in modalità funzione
      ' Abschluss der Transaktion. Chiudiamo la transazione
      .Commit
    Else
      message.Info("db existiert bereits")
    Endif
    ' Schließen der Verbindung. Chiudiamo la connessione
    .Close
  End With

  ' $hConn.Open
  ' If Not $hConn.Databases.Exist(mydbname) Then
  '   $hConn.Databases.Add(mydbname)
  '   Print "Datenbank '" & mydbname & "' existiert nicht, lege Datenbank an,"
  ' Else
  '   'message.Info("db existiert bereits")
  ' End If
  '
  ' ''Datenbabk Tabellen anlegen Crea le tabelle del database
  ' machmatabellen()
  ' $hConn.Close
 
  ' Wenn etwas nicht funktioniert, geben Sie alles so zurück, wie es zu Beginn der Transaktion war.
  ' Se qualcosa non funziona riporta tutto come era all'inizio della transazione
Catch
  $hConn.Rollback()
  Error.Raise(Error.Text & " - " & Error.Code)
  $hConn.Close

End

Public Sub Form_Close()

  $hConn.Close

End


Public Sub machmatabellen()

  If db.Exec("Create TABLE If Not EXISTS `zumachen` ( 'id' INTEGER PRIMARY KEY  AUTOINCREMENT ,`Name` VARCHAR( 150 ) NOT NULL ,`tag` INT  NULL ,`mon` INT  NULL ,`jahr` INT NULL ,`prio` int  NULL ,`arbeit` VARCHAR( 200 ) NULL,`kildat` VARCHAR ( 25 ),`erledi` VARCHAR( 20 ) NULL,`killen` VARCHAR( 5 ) NULL,`extID` VARCHAR( 200 ) NULL)") Then
    Print "lege Tabelle 'zumachen' an"

  ' Else
  '   Print "Tabelle 'zumachen'existiert"
  End If
 
  '' L'errore lo ottieni da catch in Form_Open
  ' If Error Then
  '   Message("MySQL Error: " & Error.Text)
  ' End If

End

Public Sub Button1_Click()'' Aufgabe eintragen

  Dim iTag, iMon, iJahr As Integer
  Dim sName, sCombo, sText, sVal As String

  db.Debug = True
  sName = User.Name
  iTag = Day(Now)
  iMon = Month(Now)
  iJahr = Year(Now)
  sCombo = ComboBox1.Text
  sText = TextBox1.Text
  sVal = "ja"

Stop
  With $hConn
    .Close
    .Type = "sqlite3"
    '.Host = "/home/" & user.Name & "/" & FMain.myordner ' ??????????????????
    .Host = User.Home &/ myordner
    .Name = mydbname  '""  ' hier kommt nichts rein, sonst will der Treiber eine vorhandene Datei öffnen -> u.U. Fehler, Datei wurde nicht gefunden.
    .Open
    .Begin
    ' ACHTUNG: Datentypen müssen beachtet werden (z. B. keine Zeichenketten eingeben, wenn die Datenbank ganze Zahlen erwartet), Daten eingeben, wenn sie obligatorisch sind (nicht null) und Positionen.
    ' Auch mögliche Injektionen müssen berücksichtigt werden.
    ' ATTENZIONE: Occorre rispettare i tipi di dati (es. non inserire stringhe dove il database aspetta numeri interi) inserire dati dove obbligatori (not null) e le posizioni.
    ' Occorre inoltre tener conto delle possibili iniezioni.
    .Exec("INSERT INTO zumachen (Name, tag, mon, jahr, prio, arbeit, killen) VALUES (&1, &2, &3, &4, &5, &6, &7)", sName, itag, iMon, iJahr, sCombo, sText, sVal)
    .Commit
    .Close
  End With
 
  ' $hConn.Open
  ' db.Exec("insert into zumachen (tag,mon,jahr,prio,arbeit,killen) values('" & Format$(Now, "dd") & "','" & Format$(Now, "mm") & "','" & Format$(Now, "yyyy") & "','" & ComboBox1.Text & "','" & TextBox1.Text & "','ja') ")
  ' $hConn.Close

Catch
  $hConn.Rollback()
  Error.Raise(Error.Text & " - " & Error.Code)
  $hConn.Close

End
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro