SQLite3 - .name unter 1.9.46a

Spezielle Fragen zu PostgreSQL, MySQL, SQLite, SQL ...
Antworten
Duke
Foriker
Beiträge: 11
Registriert: Mo 11. Dez 2006, 19:39
Kontaktdaten:

SQLite3 - .name unter 1.9.46a

Beitrag von 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
Kontaktdaten:

Vielleicht noch mal was klarer...

Beitrag von 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

roemi
Site Admin
Beiträge: 389
Registriert: So 11. Dez 2005, 20:05
Wohnort: Hanau / Germany
Kontaktdaten:

Beitrag von 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

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

Nee, soll schon SQLite sein...

Beitrag von 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.

roemi
Site Admin
Beiträge: 389
Registriert: So 11. Dez 2005, 20:05
Wohnort: Hanau / Germany
Kontaktdaten:

Beitrag von 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

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

[gelöst] Datenbanknamen bei SQLite

Beitrag von 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.

roemi
Site Admin
Beiträge: 389
Registriert: So 11. Dez 2005, 20:05
Wohnort: Hanau / Germany
Kontaktdaten:

Beitrag von 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

grefabu
Foriker
Beiträge: 15
Registriert: Sa 15. Apr 2006, 13:49
Wohnort: Bad Homburg
Kontaktdaten:

Und dann,...?

Beitrag von 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]

roemi
Site Admin
Beiträge: 389
Registriert: So 11. Dez 2005, 20:05
Wohnort: Hanau / Germany
Kontaktdaten:

Beitrag von 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

grefabu
Foriker
Beiträge: 15
Registriert: Sa 15. Apr 2006, 13:49
Wohnort: Bad Homburg
Kontaktdaten:

Beitrag von 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]

roemi
Site Admin
Beiträge: 389
Registriert: So 11. Dez 2005, 20:05
Wohnort: Hanau / Germany
Kontaktdaten:

Beitrag von 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

grefabu
Foriker
Beiträge: 15
Registriert: Sa 15. Apr 2006, 13:49
Wohnort: Bad Homburg
Kontaktdaten:

Beitrag von 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]

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast