SQLite3 - .name unter 1.9.46a

Wie auf MySql und den ganzen Rest zugreifen ...

SQLite3 - .name unter 1.9.46a

Beitragvon Duke » Mo 11. Dez 2006, 20:15

Nachdem ich die erste kleine Klippe unter 1.9.46a beim Datenbank-Beispiel umschifft habe (man nehme als Type statt "SQLite" entweder SQLIte2 oder SQLite3, stellt sich das nächste Problem.

Ich möchte gerne festlegen, wo SQLite die Datenbankdatei ablegt.
Per .name kann man bei SQLite ja den vollen (auch absoluten) Pfad angeben - theoretisch. Denn wenn man .name festlegt, sagt einem der SQLite-Treiber: Connection is not opened.

Öffne ich hingegen die Connection per .open, sagt einem Gambas, daß diese Datei nicht existiert - logisch, die will ich ja erst noch anlegen.

Da beißt sich die Katze in den Schwanz - ich kann eine SQLite-Datenbank (wenn man .name nicht leer läßt) nich öffnen, wenn ich einen Pfad angebe - und einen Pfad kann ich nur angeben, wenn ich sie öffne....

Beispiel des modifizierten Database-Beispiels:

Code: Alles auswählen
DIM tName, dbName AS String

  TRY $hConn.Close ' Schadet ja nichts...
 
  tName = txtName.Text
  dbName = dname.Text  ' wird im Form auf "/etc/test.db" gesetzt.
 
  $hConn.Type = cmbType.Text  ' ist 'sqlite3'
  $hConn.name = dbname
 
  'bis hier kein (für mich erkennbarer) Fehler....
 
IF Exist(dbName) THEN ' Prüfen, ob Datei schon vorhanden
      TRY $hConn.Open
ELSE   ' Wenn nicht, dann anlegen
      $hConn.Open      ' Geht nicht, weil die Datei unter "dbname" nicht existiert - umgekhrt geht aber auch nicht...
      $hConn.Databases.Add(dbname) ' Versuch, einfach mal eine anzulegen (klappt nicht)
ENDIF
 
  $hConn.Name = dbName
  $hConn.Open

CATCH

  Message.Error(DConv(Error.Text))

END


Gibt immer den gleichen Fehler, weil eben nicht "connected" wurde. Connecten (.open) kann man aber nur, wenn die Datei auf dem Pfad schon existiert oder wenn man den Standard-Pfad (.name="") nimmt.

Dateizugriffsrechte sind nicht das Problem. Ferner funktiniert natürlich auch die ":memory"-Version von SQLite nicht, gleiche Symptome.

Sehr seltsam...

Duke. :roll:
Duke
Foriker
 
Beiträge: 11
Registriert: Mo 11. Dez 2006, 19:39

Vielleicht noch mal was klarer...

Beitragvon Duke » Di 12. Dez 2006, 11:03

Eigentlich enthält mein Code zuviel Kram, deshalb das ganze nochmal vereinfacht:


Code: Alles auswählen
    
dim hDB as connection

with hDB
.type = "SQLite3"
.name=""
end with
try hDB.open


Funktioniert (aber nicht so wie ich will, weil die DB dann in irgendeinem Gambas-Verzeichnis steht). ".name" kann man dann allerdings auch ganz weglassen.

Code: Alles auswählen
dim hDB as connection

with hDB
.type = "SQLite3"
.name="/tmp/test.db"
end with
try hDB.open


Funktioniert nicht (sollte es aber). "hDB.name" sollte eigentlich für SQLite den Pfad und Datenbanknamen festlegen. Beim zweiten Beispiel kommt bei "try HDB.Open" dann "Datei konnte nicht gefunden werden". Logisch, die will ich ja auch erst noch erstellen. Irgendwie fehlt mir hier beim ".open" sowas wie ein NEW -"wenn's nicht existiert, dann leg's an"-Parameter, oder ein ".create", aber nicht für Tables, sondern auf Dateiebene.

Duke.

Fedora Core 6, Gambas 1.9.46a
Duke
Foriker
 
Beiträge: 11
Registriert: Mo 11. Dez 2006, 19:39

Beitragvon roemi » Di 12. Dez 2006, 12:32

Schau bitte mal Kapitel 15 im Buch.
Evtl. klärt sich hier Dein Problem.

Ich persönlich verwende MySQL und hatte ein solches Problem noch nicht
Römi (seit 1989 bekennender Bergradfahrer und professioneller Biertrinker)
http://www.roemi.de
roemi
Site Admin
 
Beiträge: 389
Registriert: So 11. Dez 2005, 20:05
Wohnort: Hanau / Germany

Nee, soll schon SQLite sein...

Beitragvon Duke » Di 12. Dez 2006, 13:06

Kapitel 15 hat mir zwar bei dem ":memory:"-Geschichten einen Hinweis gegeben (Doppelpunkt vorher und nachher) , aber die dort beschriebene Syntax für ".name" funktioniert so leider auch nicht. Wenn ich .name auf irgendeinen Wert setze, dann denkt der SQLite-Treiber, daß ich auf diese Datei zugreifen will (daß sie schon existiert) und nicht, daß ich sie neu anlegen will.

MySQL/PostgreSQL sind keine Lösung, viel zu "fett" für mein Problem. ich brauch' keine Benutzerverwaltung und den Kram. Mit Arrays will ich aber auch nicht rumhampeln, dafür wird's dann wieder zu unübersichtlich.
Nein, SQLite ist genau das richtige - bin ja nun auch nicht der einzige, der das benutzt :D

Duke.
Duke
Foriker
 
Beiträge: 11
Registriert: Mo 11. Dez 2006, 19:39

Beitragvon roemi » Di 12. Dez 2006, 13:51

Hi, ich kann Dir zwar nicht helfen, aber hoffe auf eine Lösung die Du dann hier postest.
Du hast mich nämlich gerade auf den Geschmack gebracht.
SQlite könnte auch für meine Anwendung besser sein.

Verstehe ich richtig das ich keine separate Anwendung installieren muss und die Bordmittel von Gambas reichen?
Römi (seit 1989 bekennender Bergradfahrer und professioneller Biertrinker)
http://www.roemi.de
roemi
Site Admin
 
Beiträge: 389
Registriert: So 11. Dez 2005, 20:05
Wohnort: Hanau / Germany

[gelöst] Datenbanknamen bei SQLite

Beitragvon Duke » Mi 13. Dez 2006, 22:54

Ja, für SQLite scheint jedenfalls kein Server wie bei MySQL nötig zu sein (ausreichend ausführlich ist SQLite in der Wikipedia erklärt - auch was es z.B. von MySQL unterscheidet, sprich, was es nicht kann). SQLite erzeugt auch nur eine einzige Datei - und wo man die hin haben will kann man jetzt doch bestimmen. Fast wie bei Acess, aber irgendwie besser :)

Die Lösung liegt in ".host". Obwohl SQLite keine Serverdtenbank ist kann man per .host den Pfad (ohne Dateinamen) angeben. Wenn man bei dem Database-Beispiel unter Host z.B. "/tmp/MeinVerzeichnis/" angibt, kann man im Feld "Database" den Dateinamen festlegen, Natürlich muß man Schreib-Leserechte für diesen Pfad haben.

Nicht vergessen bei Type "sqlite3" (case-sensitiv) zu verwenden, ich habe unter 1.9.46a trotz dutzender Neucompilierungen (immer auf der Suche nach der fehlenden Komponente) kein sqlite oder sqlite2 zum laufen bekommen - obwohl mir nur noch corba und firebird fehlten.

Im Listing (hart codiert) sieht das dann so aus:

Code: Alles auswählen
 DIM sName AS String

  TRY $hConn.Close
  '$hConn = NEW Connection

  sName = "MeineDatenbankdatei"

  WITH $hConn
    .Type = "sqlite3" ' ' wird im Original aus dem Form geholt.
    .Host = "/meinDatenbankpfad/" ' ohne Dateiname !
    ' .Login = txtUser.Text # bei SQLite nicht erforderlich - keine Benutzerverwaltung
    '.Password = txtPassword.Text # wie bei .Login
    .Name = ""  ' hier kommt nichts rein, sonst will der Treiber eine vorhandene Datei öffnen -> u.U. Fehler, Datei wurde nicht gefunden.
  END WITH

  IF chkCreate.Value THEN ' "Lege neue Datei an, wenn nicht vorhanden"

    $hConn.Open ' Komischerweise funktioniert das, obwohl der Dateiname (Variable sName) eigentlich erst im Anschluß hinzugefügt wird.
    IF NOT $hConn.Databases.Exist(sName) THEN
      $hConn.Databases.Add(sName)
    ENDIF
    $hConn.Close


Ich denke, daß ist jedenfalls schon mal ein Anfang, um mit SQLite3 zu experimentieren.

Duke.
Duke
Foriker
 
Beiträge: 11
Registriert: Mo 11. Dez 2006, 19:39

Beitragvon roemi » Do 14. Dez 2006, 07:57

Thx, dann werde ich mich mal dran machen :D
Römi (seit 1989 bekennender Bergradfahrer und professioneller Biertrinker)
http://www.roemi.de
roemi
Site Admin
 
Beiträge: 389
Registriert: So 11. Dez 2005, 20:05
Wohnort: Hanau / Germany

Und dann,...?

Beitragvon grefabu » Do 24. Mai 2007, 13:33

Hallöchen,

gut, jetzt weiß ich wie ich eine DB erstelle, aber wie erstelle ich jetzt eine Tabelle in der DB?

So habe ich es versucht:
Code: Alles auswählen
' Gambas class file


PUBLIC SUB Form_Open()
   DIM db AS NEW Connection

  DIM erg AS Result

  TRY db.Close
    WITH db
     .Type = "sqlite3"
     .Host = "/home/gregor/"
     .Name = ""
   END WITH
   
   db.Open
   IF NOT db.Databases.Exist("test") THEN
    db.Databases.Add("test")
    message.Info("test angelegt")
   ELSE
    message.Info("test existiert bereits")
   END IF
   
  TRY db.Close
    WITH db
     .Type = "sqlite3"
     .Host = "/home/gregor/"
     .Name = "test"
     .Open
   END WITH
//hier kommt der Fehler:
   db.Exec("CREATE TABLE `erster` ( `eins` VARCHAR( 255 ) NOT NULL , `zwei`  VARCHAR( 255 ) NOT NULL ))")

END

Habs auch schon ein wenig anders versucht,...
Ich bekomme den Fehler
Code: Alles auswählen
Query failed: SQL error or missing database


Vielleicht gibte es von Euch einen Klapps auf den Hinterkopf?

Grüße

Gregor

P.S. Ist es schon sinnvoll mit Gambas 1.9.49 zu arbeiten oder doch lieber 1.0.X?
Siegen tut, wer öfters aufsteht als hinfällt. [irgend jemand]
grefabu
Foriker
 
Beiträge: 15
Registriert: Sa 15. Apr 2006, 13:49
Wohnort: Bad Homburg

Beitragvon roemi » Fr 25. Mai 2007, 17:50

db.EXEC("CREATE TABLE `erster` ( `eins` VARCHAR( 255 ) NOT NULL , `zwei` VARCHAR( 255 ) NOT NULL ))")
(((( )))))


Also ich zähle 4 offene und FÜNF geschlossene Klammern. :wink:
Römi (seit 1989 bekennender Bergradfahrer und professioneller Biertrinker)
http://www.roemi.de
roemi
Site Admin
 
Beiträge: 389
Registriert: So 11. Dez 2005, 20:05
Wohnort: Hanau / Germany

Beitragvon grefabu » So 27. Mai 2007, 08:20

1,2 ,3 , viele

Das mit dem Zählen übe ich noch mal,...

Grüße

Gregor
Siegen tut, wer öfters aufsteht als hinfällt. [irgend jemand]
grefabu
Foriker
 
Beiträge: 15
Registriert: Sa 15. Apr 2006, 13:49
Wohnort: Bad Homburg

Beitragvon roemi » Mo 28. Mai 2007, 09:25

War es den wenigstens der Grund .... ? 8-)
Römi (seit 1989 bekennender Bergradfahrer und professioneller Biertrinker)
http://www.roemi.de
roemi
Site Admin
 
Beiträge: 389
Registriert: So 11. Dez 2005, 20:05
Wohnort: Hanau / Germany

Beitragvon grefabu » Mo 28. Mai 2007, 09:53

Hallo Roemi,

klar,

ich versuche für mein kleines Projekt (eine Vereinsverwaltung) eine Routine zu schreiben, die Automatisch eine SQLite Datenbank anlegt, wenn noch keine definiert ist. Sobald das Projekt ein wenig weiter ist, werde ich es hier auch vorstellen.

Viele Grüße

Gregor
Siegen tut, wer öfters aufsteht als hinfällt. [irgend jemand]
grefabu
Foriker
 
Beiträge: 15
Registriert: Sa 15. Apr 2006, 13:49
Wohnort: Bad Homburg


Zurück zu Datenbankzugriff

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast