Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ODBC Verbindung innerhalb des MSSQL Servers aufbauen (https://www.delphipraxis.net/103312-odbc-verbindung-innerhalb-des-mssql-servers-aufbauen.html)

Jelly 14. Nov 2007 10:21

Datenbank: MSSQO • Version: 2000 • Zugriff über: ADO.NET

ODBC Verbindung innerhalb des MSSQL Servers aufbauen
 
Wir haben hier das Problem, dass mit 2 Serversystem gearbeitet wird: Einer IBM AS400 Machine und einem MSSQL Server. Bevor alles auf den SQL Server migriert ist, haben wir hier teilweise ein Misch an Informationen in den beiden Systemen.

Für meinen konkreten Fall muss ich innerhalb vom SQL Server (Stored Procedure oder Funktion, egal), auf eine 'Tabelle' der AS400 lesend zugreifen. Wir haben einen ODBC Treiber für die AS400, die die Verbindung über ADO.NET klappt aus C# heraus.

Kann der SQL Server dieser ODBC irgendwie intern auch nutzen. Ich möchte letzten Endes über einen Befehl, den ich an den SQL Server schicken, Daten vom AS400 erhalten.

shmia 14. Nov 2007 11:35

Re: ODBC Verbindung innerhalb des MSSQL Servers aufbauen
 
Zitat:

Zitat von Jelly
Kann der SQL Server dieser ODBC irgendwie intern auch nutzen. Ich möchte letzten Endes über einen Befehl, den ich an den SQL Server schicken, Daten vom AS400 erhalten.

Ja, das geht.
Man muss im Enterprise Manager unter Sicherheit->Verbindungsserver einen neuen Eintrag vornehmen.

Jelly 14. Nov 2007 12:09

Re: ODBC Verbindung innerhalb des MSSQL Servers aufbauen
 
Danke shmia,

hab jetzt eine Lösung direkt über T-SQL gesucht, und auch schon fast zufriedenstellend gefunden... Das Stichwort heisst spAddLinkedServer:

Folgendes SQL Skript klappt schon mal fast:
SQL-Code:
EXEC sp_addlinkedserver
   @server = 'Servername',
   @srvproduct = 'AS400 Client Access',
   @provider = 'MSDASQL',
   @provstr = 'Driver={iSeries Access ODBC Driver};SYSTEM=AS400;CMT=0;DBQ=DBNAME_ON_AS400;NAM=0;DFT=5;DSP=1;TFT=0;TSP=0;DEC=0;XDYNAMIC=0;RECBLOCK=2;BLOCKSIZE=32;SCROLLABLE=0;TRANSLATE=0;LAZYCLOSE=1;LIBVIEW=0;REMARKS=0;CONNTYPE=0;SORTTYPE=0;PREFETCH=0;DFTPKGLIB=QGPL;LANGUAGEID=ENU;SORTWEIGHT=0;MAXFIELDLEN=32;COMPRESSION=0;ALLOWUNSCHAR=0;SEARCHPATTERN=1;MGDSN=0'

EXEC sp_serveroption
   @server = 'DBNAME_ON_AS400',
   @optname = 'data access',
   @optvalue = TRUE

EXEC sp_addlinkedsrvlogin
  @rmtsrvname = 'DBNAME_ON_AS400',
  @useself = false,
  @rmtuser = 'username',
  @rmtpassword = 'password'
Führe ich allerdings ein Select aus. z.B. über:
SQL-Code:
select m.* from OpenQuery(DBNAME_ON_AS400, 'select * from Medecinn order by nommed') m
kriege ich zwar Records angezeigt, ABER NICHT ALLE :wiejetzt:

Ich geh mal von irgendwelchen Cache Problemen aus, hab aber keine Ahnung wo ich da angreifen könnte...

Jemand noch eine Idee?

Jelly 14. Nov 2007 12:42

Re: ODBC Verbindung innerhalb des MSSQL Servers aufbauen
 
Viiiiel googeln löste dann plötzlich mein Problem...

Es lag am Connectionstring, den ich im Parameter @provstr bei sp_addlinkedserver übergebe. Ist wohl ein AS400 typisches Problem. Durch Setzen von BLOCKSIZE=0 (anstatt 32 = 32kB) werden ALLE Zeilen zurückgeliefert...

Hier nochmals das Ganze vervollständigt:

SQL-Code:
EXEC sp_addlinkedserver
   @server = 'Servername',
   @srvproduct = 'AS400 Client Access',
   @provider = 'MSDASQL',
   @provstr = 'Driver={iSeries Access ODBC Driver};SYSTEM=AS400;CMT=0;DBQ=DBNAME_ON_AS400;NAM=0;DFT=5;DSP=1;TFT=0;TSP=0;DEC=0;XDYNAMIC=0;RECBLOCK=2;BLOCKSIZE=0;SCROLLABLE=0;TRANSLATE=0;LAZYCLOSE=1;LIBVIEW=0;REMARKS=0;CONNTYPE=0;SORTTYPE=0;PREFETCH=0;DFTPKGLIB=QGPL;LANGUAGEID=ENU;SORTWEIGHT=0;MAXFIELDLEN=32;COMPRESSION=0;ALLOWUNSCHAR=0;SEARCHPATTERN=1;MGDSN=0'

EXEC sp_serveroption
   @server = 'DBNAME_ON_AS400',
   @optname = 'data access',
   @optvalue = TRUE

EXEC sp_addlinkedsrvlogin
  @rmtsrvname = 'DBNAME_ON_AS400',
  @useself = false,
  @rmtuser = 'username',
  @rmtpassword = 'password'
Abfragen kann man das Ganze dann mit
SQL-Code:
select m.* from OpenQuery(DBNAME_ON_AS400, 'select * from Medecinn order by nommed') m


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 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 by Thomas Breitkreuz