Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Guida per scrivere in AS/400 usando openquery

786 views
Skip to first unread message

David Martin

unread,
Dec 22, 2010, 5:43:21 AM12/22/10
to
Dopo anni di delusioni e parolacce, sono finalmente riuscito a scrivere
direttamente su DB2 di AS/400-iSeries usando il t-sql con OPENQUERY,
senza dover per forza usare i DTS-SSIS.

Scrivo questo post perché magari può essere utile a qualcun altro, anche
se questo ng è ormai in disuso...

La procedura è stata testata su un iSeries 520 V5R2M0, ma sono
abbastanza convinto che funzioni anche su modelli più vecchi e più
nuovi, perché quello che fino ad oggi non ero riuscito a risolvere era
un problema "concettuale" e non legato alla specifica macchina che sto
usando.

Veniamo al dunque:
1. Nella macchina in cui gira il servizio di SQL Server, installare il
Client Access/iSeries Access. E' sufficiente installare i "programmi
obbligatori" (sono le funzionalità di base che potrebbero essere
indicate con altri nomi, a seconda della versione che si sta
installando) e la parte di "accesso ai dati".

2. Nella macchina in cui gira il servizio di SQL Server, creare un nuovo
dsn (data source name), che utilizzi i driver odbc appena installati.
Caratteristiche del dsn:
- nella scheda "server", il tipo di connessione deve essere
"lettura/scrittura (consentite tutte le istruzioni sql)";
- nella scheda "prestazioni" > "avanzate", attivare l'opzione "utilizza
il blocco con un richiamo di 1 riga".

3. Nell'AS/400-iSeries, creare un ricevitore di giornale, se non ne
avete già uno. Da una lincea comandi, lanciate un comando simile a:
CRTJRNRCV JRNRCV(QGPL/QGPLJRNRCV) THRESHOLD(100000) TEXT('Testjournalrcv')

4. Nell'AS/400-iSeries, creare un giornale per il/i file che si desidera
aggiornare direttamente da SQL Server:
CRTJRN JRN(QGPL/QGPLJRN) JRNRCV(QGPL/QGPLJRNRCV) MNGRCV(*SYSTEM)
DLTRCV(*YES) TEXT('Testjournal')
Notare che il parametro JRNRCV richiama il ricevitore di giornale creato
al punto precedente.

5. Nell'AS/400-iSeries, presumo che esistano già il/i file che volete
aggiornare direttamente da SQL Server. Se non esistono, è il momento di
crearli!

6. Nell'AS/400-iSeries, avviare la "giornalizzazione" del/i ile che
volete aggiornare direttamente da SQL Server:
STRJRNPF FILE(Libreria/File) JRN(QGPL/QGPLJRN) OMTJRNE(*OPNCLO)
Questo comando va ripetuto per ciascun file. Se avete molti file da
mettere sotto giornale, probabilmente esiste un comando più adatto, ma
sinceramente non so aiutarvi.

7. Dal Management Studio, create un nuovo linked server:
---
EXEC master.dbo.sp_addlinkedserver @server = N'AS400',
@srvproduct=N'AS400', @provider=N'MSDASQL', @datasrc=N'AS400';
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'AS400',@useself=N'False',@locallogin=NULL,@rmtuser=N'USERPC',@rmtpassword='########';

EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'collation
compatible', @optvalue=N'false';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'data
access', @optvalue=N'true';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'dist',
@optvalue=N'false';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'pub',
@optvalue=N'false';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'rpc',
@optvalue=N'true';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'rpc out',
@optvalue=N'true';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'sub',
@optvalue=N'false';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'connect
timeout', @optvalue=N'0';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'collation
name', @optvalue=null;
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'lazy schema
validation', @optvalue=N'false';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'query
timeout', @optvalue=N'0';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'use remote
collation', @optvalue=N'true';
EXEC master.dbo.sp_serveroption @server=N'AS400', @optname=N'remote proc
transaction promotion', @optvalue=N'true';
---
I valori ai quali stare attenti sono:
- @datasrc=N'AS400', che deve avere lo stesso nome del dsn creato al
punto 2;
- @rmtuser=N'USERPC' e @rmtpassword='########' che devono essere
valorizzati con nome username e password di un utente che ha accesso
all'AS/400-iSeries.
Il resto delle opzioni potete lasciarle così come sono.
Attenzione che se decidete di non chiamare il linked server 'AS400',
dovete indicare il nuovo nome in tutte le righe della mia istruzione.

8. A questo punto potete testare se linked server e dsn sono corretti,
con un'istruzione di selezione:
SELECT * FROM OPENQUERY(AS400, 'SELECT * FROM Libreria.File');

9. Ora dovreste essere in grado di:
9.1 cancellare:
DELETE OPENQUERY (AS400, 'SELECT CampoPK FROM Libreria.File WHERE
CampoRicerca = ''pippo''');

9.2 inserire:
INSERT OPENQUERY (AS400, 'SELECT CampoPK, CampoRicerca FROM Libreria.File')
VALUES (1, 'pluto');

9.3 aggiornare:
UPDATE OPENQUERY (AS400, 'SELECT CampoRicerca FROM Libreria.File WHERE
CampoPK = 1')
SET CampoRicerca = 'topolino';

9.4 aggiornare in modo un po' più complesso:
UPDATE t1
SET CampoRicerca = 'quiquoqua'
FROM OPENQUERY (AS400, 'SELECT CampoPK, CampoRicerca FROM
Libreria.File') AS t1
INNER JOIN miodb.dbo.tabella AS t2
ON t1.CampoPK = t2.CampoPK
WHERE t2.Nome = 'archimede';

HTH

--
David Martin

0 new messages