Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi JOIN über unterschiedliche DBsysteme möglich? (https://www.delphipraxis.net/116108-join-ueber-unterschiedliche-dbsysteme-moeglich.html)

PASST 23. Jun 2008 17:20

Datenbank: MS SQL Server • Version: 2000 • Zugriff über: ADO

JOIN über unterschiedliche DBsysteme möglich?
 
Hallo allerseits,

ich habe mal wieder ein seltsames Vorhaben. Es handelt sich eigentlich nur um eine einzige Abfrage und im Resultat bleibt die Zahl der Datensätze sicherlich weit unter 1000.

Ich möchte eine Verknüpfung zwischen zwei unterschiedlichen Datenbanksystemen erzeugen. Einerseits habe ich Daten in einer dBase-Datei, die ich mit Daten aus einer MS SQL Server 2000 Datenbank verknüpfen möchte. Geht das überhaupt?

Der umständliche Umweg wäre:
1) Die benötigten dBase-Daten abfragen, ich benötige [Name, PersNr, DatevNr].
2) Das Resultat des Feldes [Datevnr] in einen String der Form '(1, 17, 134, 135, 144, 150)' zu übertragen.
3) Diesen String in die Where-Klausel der Abfrage auf die SQL Server DB einbinden.
4) Dieses Resultat der SQLServer-Abfrage wieder je Datensatz mit der Abfrage aus 1) abgleichen, so dass ich die richtige Schreibweise des Namens und die richtige PersNr habe.
Ihr seht, recht umständlich das ganze. Geht es auch einfacher?

Gruß
Peter

NormanNG 23. Jun 2008 17:28

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Hi,

ich würde eine SP für den SQLServer schreiben, in der die externen Daten
mittels OPENROWSET hereingeholt und dann mit den entsprechenden SQL-Daten
verarbeitet werden (Ob das auch mit dBase geht, kann ich allerdings nicht
sagen).

Hansa 23. Jun 2008 17:56

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Zitat:

Zitat von PASST
Ich möchte eine Verknüpfung zwischen zwei unterschiedlichen Datenbanksystemen erzeugen. Einerseits habe ich Daten in einer dBase-Datei, die ich mit Daten aus einer MS SQL Server 2000 Datenbank verknüpfen möchte. Geht das überhaupt?..

Grundsätzlich gilt : alles geht. :mrgreen: Notfalls muss das in eine Textdatei und dann wieder importiert werden.

RavenIV 24. Jun 2008 08:10

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Also ich würde mir die Dbase-Daten in eine MemTable (z.B. von den RxKomponenten) laden.
Dann kannst Du in der Abfrage für MS-SQL darauf zugreifen.

mkinzler 24. Jun 2008 08:17

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Per ADO kann man auch direkt auf dBase-Dateien zugreifen und dann auch über DB-Grenzen hinweg abfragen

joachimd 24. Jun 2008 09:07

Re: JOIN über unterschiedliche DBsysteme möglich?
 
In µ$ SQL Server kannst Du iirc externe Datenbanken über OLE DB/ODBC einbinden. Dann macht alles der SQL Server und Du brauchst Dir Clientseitig keinen mehr abzubrechen.

PASST 24. Jun 2008 16:24

Re: JOIN über unterschiedliche DBsysteme möglich?
 
@joachimd
Wie ich per ODBC auf dbase Daten zugreife, ist mir bekannt. Wie kann ich aber diese einer MS SQL Datenbank zur Verfügung stellen? Ein reiner Lesezugriff würde mir auch reichen!

NormanNG 24. Jun 2008 16:29

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Hi,

Zitat:

Wie ich per ODBC auf dbase Daten zugreife, ist mir bekannt. Wie kann ich aber diese einer MS SQL Datenbank zur Verfügung stellen? Ein reiner Lesezugriff würde mir auch reichen!
ich darf nochmal vorsichtig auf meinen Post #2 hinweisen :wink:
Suche in der Hilfe zum SQLQueryAnanlyser (BOL) mal nach "OPENROWSET"...

PASST 24. Jun 2008 16:32

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Sorry, ich hab deine Antwort ganz vergessen. Jetzt wo ich die Hilfe gelesen habe, schaut das schon mal verdammt gut aus :)
Zitat:

SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'c:\MSOffice\Access\Samples\Northwind.mdb';'Admin' ;'';
Employees)

shmia 24. Jun 2008 16:44

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Alternativ kann man auch einen sog. Verbindungsserver einrichten.
Zu finden im Enterprise Manager unter "Sicherheit".

Im Prinzip werden die gleichen Techniken wie bei OPENROWSET() verwendet, nur dass man sich von den genauen Details der Verbindung unabhängig macht.
Hier ein Beispiel für einen Join über zwei Datenbanken.
Tabelle bestellung ist in der aktuellen Datenbank, TabelleXY wird aus einer externen Datenbank gelesen.
SQL-Code:
SELECT * FROM bestellung LEFT OUTER JOIN VerbindungServer1..TabelleXY ON .....

PASST 24. Jun 2008 16:46

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Das große Problem scheint zu sein, dass dBase Tabellen sich nicht einbinden lassen.
Oder aber ich weiß nicht wie es geht!

PASST 24. Jun 2008 17:22

Re: JOIN über unterschiedliche DBsysteme möglich?
 
So, ich habe das ganze jetzt mal ein bisken getestet.

Dies ist unter gewissen Bedingungen eine funktionierde Variante:
SQL-Code:
SELECT * FROM OpenDataSource ( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="<Laufwerk:\Pfade\";Extended Properties=dBASE III;')...tabelle1
Wichtig dabei ist, dass Laufwerk ein lokal existierender Laufwerksbuchstabe ist. Es werden keine gemappten Freigaben akzeptiert und auch keine UNC-Pfade. Außerdem müssen die dBase-Tabellen Indexfrei sein.

Beide Bedingungen kann ich nicht erfüllen. Außer ich starte vorher eine Kopieraktion und bearbeite die dBase-Dateien byteweise, so dass das Index-Flag entfernt wird.

Hm, ....

shmia 24. Jun 2008 17:23

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Zitat:

Zitat von PASST
Das große Problem scheint zu sein, dass dBase Tabellen sich nicht einbinden lassen.

Tja, zwischen Microsoft und dBase gibt es eine langjährige Feindschaft. :evil:
Also ich kenne im Prinzip zwei Wege um an dBase Tabellen ranzukommen.

1.) über die Jet-Engine (also der Kern von MS Access) ist auch so ein halblebiger dBase Zugriff möglich.
(der Treiber ignoriert die Indexdateien und liest nur *.dbf-Dateien. Auch Row-locking wird ignoriert.
Tabellen, die mit Unterstrich beginnen werden nicht erkannt)
ADO -> OLE DB -> DAO(=Jet Engine) -> dBase

2.) über den Foxpro ODBC-Treiber
ADO -> OLE DB -> ODBC Provider -> ODBC -> Foxpro ODBC-Treiber
dieser Treiber kann mit Indexdateien von Clipper nicht umgehen.

Hier die Connection-Strings dazu:
http://www.connectionstrings.com/?carrier=dbffoxpro
Bei Extended Properties ist dBASE III, dBase IV und dBase 5.0 zulässig.

Es gibt/gab auch bessere ODBC-Treiber, die aber Geld kosten.

PASST 24. Jun 2008 17:51

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Ich habe im Entwickler-Forum.de ein Beitrag gefunden, der einen etwas anderen Ansatz hat. Allerdings wohl unter Berücksichtigung MS SQL Server 2005 (Express).

PASST 24. Jun 2008 18:01

Re: JOIN über unterschiedliche DBsysteme möglich?
 
:) Hurra, ich habe jetzt eine Variante gefunden, die mit UNC-Pfad funktioniert:

SQL-Code:
SELECT * FROM OPENROWSET(
'MSDASQL','DRIVER={Microsoft Dbase driver (*.dbf)}',
'SELECT * FROM \\SERVER\Pfade\Tabelle1.dbf')
Das einzige Problem ist noch, dass ich vorher das Byte für den MDX-Flag der dBase Dateien löschen muss. Das ist aber nicht wirklich ein Problem, da Clipper zwar diesen Flag setzt, aber selber nicht verwendet. Außerdem will ich wie gesagt die dBase Daten nur lesen und nichts schreiben.

shmia 24. Jun 2008 18:03

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Zitat:

Zitat von PASST
Ich habe im Entwickler-Forum.de ein Beitrag gefunden, der einen etwas anderen Ansatz hat.

Ja, das Kochrezept in Beitrag #4 ist ganz interessant.
Er verwendet Verbindungsserver (=Linked Server) und den Foxpro ODBC-Treiber.
download hier: http://www.microsoft.com/downloads/d...a-95a3289c5fd4
Das müsste analog auch auf den SQL Server 2000 passen.

Hab's grad' mal auf MS SQL Server 2000 SP4 getestet:
Tabellen mit SELECT abfragen geht. Update von Tabellen geht nicht.

joachimd 25. Jun 2008 08:06

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Zitat:

Zitat von shmia
1.) über die Jet-Engine (also der Kern von MS Access) ist auch so ein halblebiger dBase Zugriff möglich.
(der Treiber ignoriert die Indexdateien und liest nur *.dbf-Dateien. Auch Row-locking wird ignoriert.
Tabellen, die mit Unterstrich beginnen werden nicht erkannt)
ADO -> OLE DB -> DAO(=Jet Engine) -> dBase

2.) über den Foxpro ODBC-Treiber
ADO -> OLE DB -> ODBC Provider -> ODBC -> Foxpro ODBC-Treiber
dieser Treiber kann mit Indexdateien von Clipper nicht umgehen.

3. über Advantage (Local Server)

PASST 25. Jun 2008 08:55

Re: JOIN über unterschiedliche DBsysteme möglich?
 
@shmia
Wie kann ich denn unter MS SQL 20000 einen Linked Server einbinden?

PASST 25. Jun 2008 10:13

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Jetzt wo ich die Möglichkeit habe lesend auf meine dbase DB zuzugreifen, würde ich auch gerne die anderen Abfragen auch per ADO ausführen. Allerdings erhalte ich dabei eine Fehlermeldung bzgl. Datums:
SQL-Code:
where datum >= (16/5/2008)
--> Error converting data type DBTYPE_DBDATE to datetime.
Wenn ich das Datum durch year, month und day(datum) ausdrücke, funktioniert es.

Wie kann ich also das Datum-Kriterium umbauen?

mkinzler 25. Jun 2008 10:17

Re: JOIN über unterschiedliche DBsysteme möglich?
 
SQL-Code:
where datum >= '16/5/2008'
oder besser gleich mit (SQL-)Parametern

PASST 25. Jun 2008 10:21

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Ich probiere es gerade im SQL Query Analyzer aus. Dort ist der innere SQL-String in 'Anführungszeichen'. Wie kriege ich dann dort das <DATUM> = '16/5/2008' in Anführungszeichen?

SQL-Code:
SELECT *
FROM OPENROWSET(
'MSDASQL','DRIVER={Microsoft Dbase driver (*.dbf)}',
'select * from \\server\pfad\tabelle
where datum >= <DATUM> ')

shmia 25. Jun 2008 10:24

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von PASST
Wie kann ich denn unter MS SQL 20000 einen Linked Server einbinden?

Siehe Screenshots im Anhang.

PASST 25. Jun 2008 10:52

Re: JOIN über unterschiedliche DBsysteme möglich?
 
So richtig rund läufts das auch nicht.

Ich habe mir den Linked Server angelegt und dabei als Datenpfad einen UNC-Pfad angegeben. Führe ich das folgende Query am SQL Query Analyzer aus:
SQL-Code:
select * from openquery (DBASE, 'select * from tabelle')
erhalte ich je nachdem wo ich das Query ausführe entweder das korrekte Resultat oder eine Fehlermeldung.
Wenn ich lokal am Server, auf dem der SQL Server installiert ist, das Query ausführe, funktioniert alles.
Führe ich das Query an meinem Arbeitsplatz aus, auf dem ich auch den Query Analyzer installiert habe, so erhalte ich die Fehlermeldung:
SQL-Code:
OLE DB provider 'Microsoft.Jet.OLEDB.4.0' reported an error.
[OLE/DB provider returned message: '\\server\pfade' ist kein zulässiger Pfad. Stellen Sie sicher, dass der Pfad richtig eingegeben wurde und dass Sie mit dem Server, auf dem sich die Datei befindet, verbunden sind.]
OLE DB error trace [OLE/DB Provider 'Microsoft.Jet.OLEDB.4.0' IDBInitialize::Initialize returned 0x80004005:  ].

shmia 27. Jun 2008 12:09

Re: JOIN über unterschiedliche DBsysteme möglich?
 
Zitat:

Zitat von PASST
So richtig rund läufts das auch nicht.
Ich habe mir den Linked Server angelegt und dabei als Datenpfad einen UNC-Pfad angegeben

Fang erst mal klein an und kopiere die dBase-Dateien auf den Server in ein lokales Verzeichnis.
Gut möglich, dass die Funktionen zum Zugriff auf dBase-Dateien aus der Computer Steinzeit kommen und mit diesem "neumodischen UNC-Zeugs" nichts anfangen können.
Und dann gäbe es den Servicepack #8 für die Jet-Engine (=Microsoft.Jet.OLEDB.4.0); vielleicht hilft's ja.

PASST 1. Jul 2008 11:08

Re: JOIN über unterschiedliche DBsysteme möglich?
 
So, ich habe jetzt in dieser Variante gelöst.
Zitat:

Zitat von PASST
:) Hurra, ich habe jetzt eine Variante gefunden, die mit UNC-Pfad funktioniert:

SQL-Code:
SELECT * FROM OPENROWSET(
'MSDASQL','DRIVER={Microsoft Dbase driver (*.dbf)}',
'SELECT * FROM \\SERVER\Pfade\Tabelle1.dbf')
Das einzige Problem ist noch, dass ich vorher das Byte für den MDX-Flag der dBase Dateien löschen muss. Das ist aber nicht wirklich ein Problem, da Clipper zwar diesen Flag setzt, aber selber nicht verwendet. Außerdem will ich wie gesagt die dBase Daten nur lesen und nichts schreiben.

Leider lässt sich diese Datei nicht bearbeiten, um den MDX-Flag zu löschen, wenn jemand sie (mit einem anderen Programm) geöffnet hat.
Kann man dem SQL-Server nicht sagen, dass er den MDX-Flag automatisch ignorieren soll?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz