Firebird Zugriff

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Firebird Zugriff

Beitrag von mr@nline.de »

Hallo,
hat jemand schon einmal einen Zugriff eine Firebird Datenbank realisiert ?
Ich muss aus einem Fibu-Programm die OP-Daten zurücklesen und erstelle mit der ODBC-DBE eine Connection, das funktioniert auch, wenn ich jedoch auf eine Tabelle zugreifen will erhalte ich immer die Fehlermeldung, dass die Tabelle nicht geöffnet werden kann ?

Code: Alles auswählen

   DbeLoad( "ODBCDBE" )

   cConnect := "DBE=ODBCDBE"
   cConnect += ";DSN=GDI"
   cConnect += ";Database=C:\GDIFibu\DemoFibu\GDI.GDB"
   cConnect += ";User=SYSDBA"
   cConnect += ";Password=masterkey"
   oSession := DacSession():new( cConnect )

   IF .NOT. oSession:isConnected()

      ? "Unable to connect to server !"
      ? oSession:getLastMessage()
   else
      ? "connected.."
      SQL "SELECT * FROM BUCHEN" VIA oSession
      // Fehler......

   ENDIF

   oSession:disconnect()
Gruß
Manfred
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Manfred.

"VIA oSession" ist m.E. verkehrt. Da müßte "VIA ODBCDBE" stehen.
Herzlich,
Tom
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Beitrag von mr@nline.de »

Hallo tom,
das steht so in der ODBC Dokumentation...

Code: Alles auswählen

VIA <session>

The argument <session> explicitly determines the session where the SQL statement is to be executed. If <session> was not passed, the return value of DbSession() or DacSession():getDefault() is used. 
Ich habe das Kommando geändert auf

Code: Alles auswählen

SQL "SELECT * FROM BUCHEN" VIA "ODBCDBE"
Nun erhalte ich folgende Fehlermeldung

Code: Alles auswählen

----------------------------------------------------------------------
PROTOKOLL von "m:\version500\bin\Woffice.exe"
 
Betriebssystem      : Windows XP 05.01 Build 02600 Service Pack 2
----------------------------------------------------------------------
oError:args         : (01) VALTYPE= C VALUE= ODBCDBE
oError:canDefault   : Nein
oError:canRetry     : Nein
oError:canSubstitute: Ja
oError:cargo        : 
oError:description  : Parameter hat falschen Typ
oError:filename     : 
oError:genCode      : 2
oError:operation    : getLastMessage
oError:osCode       : 0
oError:severity     : 2
oError:subCode      : 1025
oError:subSystem    : BASE
oError:thread       : 4
oError:tries        : 0
----------------------------------------------------------------------
CALLSTACK:
----------------------------------------------------------------------
Aufgerufen von SQLSTMTEXEC(125)
Aufgerufen von SQLGETRESULT(277)
Aufgerufen von TESTGDI(1518)
Irgend eine Idee?

Manfred
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Manfred,
Tom schrieb VIA ODBCDBE und nicht VIA "ODBCDBE"

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Beitrag von mr@nline.de »

Also ich habe das nochmals überprüft,
wenn schon mit VIA dann muß dort "ODBCDBE" in Hochkomma stehen,
da ansonsten der Compiler eine undefinierte Variable ODBCDBE findet.

Code: Alles auswählen

// Execute a statement
#xcommand SQL <(x)> [VIA <session>]  ;
              => SqlStmtExec(<(x)>,<session>,,,.F.)
Ich habe auch nochmals den Benutzernamen und das Passwort
geprüft, die sind gültigt.

Gruß
Manfred
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
mr@nline.de hat geschrieben:Also ich habe das nochmals überprüft,
wenn schon mit VIA dann muß dort "ODBCDBE" in Hochkomma stehen,
da ansonsten der Compiler eine undefinierte Variable ODBCDBE findet.
bist Du Dir da sicher? Dein Fehlerlog sagt aber was anderes...
Hast Du vielleicht eine include-Datei vergessen einzubinden?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Beitrag von mr@nline.de »

Hallo Martin,
ich hab das Ganze nochmals geprüft.

Die korrekte Syntax ist entweder

Code: Alles auswählen

      USE OPDATEN ALIAS ODBCDBE
      GO TOP
      DO WHILE ! EOF()
      ... us.w.

oder

Code: Alles auswählen

      SQL "SELECT * FROM OPDATEN" VIA oSession
Aber mein Problem scheint ein ganz anderes zu sein.
Wenn ich auf Systemdaten der Datenbank zugreife, z.B.
"Select * FROM RDB$TRIGGERS" erhalte ich ein korrektes Ergebnis, d.h.
der Zugriff funktioniert. Allerdings scheinen die Zugriffe auf die Anwendungsdaten blockiert zu sein, ich vemute fast das es sich hierbei
um Zugriffsrechte innerhalb der Datenbank handelt die ich noch genauer
untersuchen muss.
Trotzdem vielen Dank.

Gruß
Manfred
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

mr@nline.de hat geschrieben:Die korrekte Syntax ist entweder

Code: Alles auswählen

      USE OPDATEN [color=red]ALIAS[/color] ODBCDBE...
also das kann nicht sein, ein ALIAS ist nur ein Bezeichner und niemals die gewünschte DBE ... genau wie beim normalen USE ...

also kann es nur heißen

Code: Alles auswählen

      USE OPDATEN [color=red]VIA[/color] ODBCDBE [color=blue]ALIAS[/color] KFZ 
in der Hilfe steht z.B. folgendes Beispiel:

Code: Alles auswählen

wenn ODBCDBE standard DBE ist ...
cSQL := "select ...."
USE (cSQL) ALIAS Cust NEW 
Ansonsten müsste es normalerweise VIA ODBCDBE heißen wie bei den anderen Befehlen auch, es gibt aber Beispiele in der Hilfe beidenen ein VIA "ODBCDBE" angedeuted wird, was unlogisch wäre.

Das VIA des SQL Statement ist natürlich anders als das bei USE, dort wird dem SQL Statement nur das oSession Object mitgeteilt, weshalb dort eine Variable Pflicht ist. Ich sag nur SQLExpress ist einfacher ;)

PS: ich sehe gerade (in der Xpp Hilfe) seit der 1.90 kann man beim normalen USE eine Variable der DAC-Session angeben und zwar:
'entweder als Literal oder als Zeichenausdruck in Klammern' ... 'als geklammerter Ausdruck...' also auf jeden Fall so:

Code: Alles auswählen

VIA ODBCDBE oder VIA ("ODBCDBE") oder VIA (cDBE) oder VIA (oSession)
Gruß
Hubert
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hast du folgende Dateien eingebunden?

Code: Alles auswählen

#include "ODBCDBE.ch"
#include "SQLCMD.ch"
Gruß,

Andreas
VIP der XUG Osnabrück
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Beitrag von mr@nline.de »

Hubert Du hast natürlich recht...
Ich habe mich verschrieben.

Das Problem hat sich übgrigens gelöst.
Bei der Definition der Firebird ODBC-Datenquelle (DSN) muss man einen Character Set angeben, und dort war in meiner Definition der falsche Wert WIN1251 anstatt WIN1252 eingetragen.

Manfred
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Manfred,

könntest du dann hier deinen funktionierenden Code (Verbindungsaufbau und eine Abfrage) veröffentlichen, damit es alle für die Zukunft haben?
Gruß,

Andreas
VIP der XUG Osnabrück
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Beitrag von mr@nline.de »

Hallo Andreas,

hier ist ein funktionierender Quellcode für den Zugriff auf eine
Firebird Datenbank

Code: Alles auswählen

#pragma Library( "Adac20b.lib" )
#include "sqlcmd.ch"

Function TestGDI()
LOCAL cConnect, oSession

   DbeLoad( "ODBCDBE" )
   cConnect := "DBE=ODBCDBE;DSN=GDI;UID=sysdba;PWD=masterkey;DBNAME=C:\Fibu\Demo\FIBU.GDB"

   oSession := DacSession():new( cConnect )

   IF .NOT. oSession:isConnected()
      ? "Keine Verbindung zum Server möglich !"
      ? oSession:getLastMessage()
   else
      ? "Verbunden..."
      USE OPDATEN VIA ODBCDBE
      OPDATEN->(dbgotop())
      do while ! OPDATEN->(eof())
         ? OPDATEN->(fieldget(1)),OPDATEN->(fieldget(2)),OPDATEN->(fieldget(3))
         OPDATEN->(dbskip(+1))
      enddo
   ENDIF

   oSession:disconnect()

RETURN nil
Bei der Einrichtung der ODBC-DSN ist darauf zu achten, daß als
Character Set WIN1252 verwendet wird, Databaseaccount=SYSDBA und
Password=masterkey !

Gruß
Manfred
Zuletzt geändert von mr@nline.de am Mo, 27. Nov 2006 7:45, insgesamt 1-mal geändert.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
ich nehme mal an, dass die von Dir geposteten UID- und PWD-Angaben die echten Angaben sind?
Und ich gehe weiterhin davon aus, dass der Hersteller nichts dagegen hat, dass seine Passwörter öffentlich gepostet werden?
Wenn dem nicht so sein sollte, dann bitte ich Dich, die entsprechenden Angaben in Deinen Postings auf Dummywerte zu setzen, vielen Dank!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Beitrag von mr@nline.de »

Hallo Martin,
der von mir gennante Account ist der Standardaccount der in jeder Firebird Datenbank abgelegt ist und wird in diesem Fall vom Hersteller an alle Softwareentwickler weitergegeben,bzw. jeder der mit Firebird arbeitet kennt diesen Account.
Aber Du hast schon recht, Gedanken habe ich mir dabei nicht gemacht.
In Zukunft werden Platzhalter publiziert.

Gruß
Manfred
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
wenn das so ist, ist die Sache für mich erledigt - kein Problem!
Ich arbeite halt nicht mit Firebird, daher war mir das nicht bewußt.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Antworten