Discussione:
Guai con l'accesso ADO a un file di testo
(troppo vecchio per rispondere)
Newcomsas
2006-11-29 17:35:46 UTC
Permalink
Salve a tutti.
Sto testando da qualche ora la possibilità di leggere un file .txt che
contiene dati espressi in forma posizionale utilizzando una connessione ADO.
Ho seguito le istruzioni sul sito della Microsoft che si trovano qui:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnclinic/html/scripting03092004.asp

In effetti sono riuscito a creare la connessione al file di testo e ad
aprire il recordset; il problema è che pur essendoci dati nel file, il
recordset risulta sempre vuoto (eof).
Quello che segue è la parte essenziale del codice per la lettura (sto
lavorando in ambiente VB6):

Dim cnTxt As New ADODB.Connection
Dim rs As New ADODB.Recordset
cartella_txt="C:\PROXPC\" 'questa è la cartella che contiene i file di testo
cnTxt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & cartella_txt & ";" & _
"Extended Properties=""text;HDR=YES;FMT=FixedLength"""
rs.Open "SELECT * FROM EPA2.txt", cnTxt, 3, 3, &H1
Debug.Print rs(0)
End

Ecco invece il conenuto del file che sto cercando di leggere, EPA2.txt:

BUR10009999
PRE80001122
BAM97600011

Ho anche creato, sempre nella cartella che contiene i txt il file Schema.ini
che contiene le informazioni sui campi da ricercare; ecco il suo contenuto:

[EPA2.txt]
Format=FixedLength

Col1=Sigla Text Width 3
Col2=CodiceCliente Text Width 8


Qualcuno di voi sa individuare dove potrei aver fatto un errore ? Potete
eventualmente suggerirmi in quale altro posto chiedere aiuto (qui capisco di
essere al limite dell'OT).

Grazie a chiunque vorrà rispondere
Newcomsas
Lorenzo Benaglia
2006-11-29 20:31:18 UTC
Permalink
Post by Newcomsas
Ecco invece il conenuto del file che sto cercando di leggere,
BUR10009999
PRE80001122
BAM97600011
Ciao Newcomsas,

in questo post trovi alcune info:
http://groups.google.it/group/microsoft.public.it.sql/msg/cba48665ada1433b

Altre informazioni le trovi qua:

"Much ADO About Text Files"
http://msdn2.microsoft.com/en-us/library/ms974559.aspx

"How To Open Delimited Text Files Using the Jet Provider's Text IIsam"
http://support.microsoft.com/kb/262537

Io ho provato a buttare giù due righe di codice prendendo spunto
dall'esempio presente nel secondo link che ti ho segnalato.
Prima di tutto ho creato il file C:\EPA2.txt:

<BOF>
BUR10009999
PRE80001122
BAM97600011

<EOF>

Poi il file C:\Schema.ini:

<BOF>
[EPA2.txt]
Format=FixedLength

Col1=Sigla Text Width 3
Col2=CodiceCliente Text Width 8

<EOF>

<BOF> e <EOF> sono marcatori che ti fanno vedere dove inizia e dove finisce
il file, ovviamente non devi aggiungerli. Fai MOLTA ATTENZIONE all'ultimo
ritorno a capo che DEVE ESSERE presente in entrambi i files, altrimenti
avrai un errore di runtime (io l'ho evidenziato con una riga vuota) :-)

Questo è il codice VBS che interroga il file:

<BOF>
Dim objConnection
Dim objRecordset
Dim strPathtoTextFile

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

strPathtoTextFile = "C:\"

objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=FixedLength"""

objRecordset.Open "SELECT * FROM EPA2.txt", _
objConnection, adOpenStatic, adLockOptimistic, adCmdText

Do Until objRecordset.EOF
Wscript.Echo "Sigla: " & objRecordset.Fields.Item("Sigla")
Wscript.Echo "CodiceCliente: " &
objRecordset.Fields.Item("CodiceCliente")
objRecordset.MoveNext
Loop

objRecordSet.Close
objConnection.Close

Set objRecordSet = Nothing
Set objConnection = Nothing
<EOF>

A me questo codice funziona benone.
Post by Newcomsas
Grazie a chiunque vorrà rispondere
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Newcomsas
2006-11-30 11:27:15 UTC
Permalink
"Lorenzo Benaglia" ha scritto
Fai MOLTA ATTENZIONE all'ultimo ritorno a capo che DEVE ESSERE presente in
entrambi i files,
Esatto, la chiave del problema era proprio questa: inserendo il ritorno
a capo tutto funziona correttamente.
Ne approfitto per chiedere un'altra cosa (forse stavolta un po'
eccessiva).
Non c'è per caso modo di usare un'istruzione di tipo SELECT * INTO per
travasare direttamente i dati contenuti nel txt in una tabella di SQL
Server ?
Mi spiego meglio: io genero un recordset del tipo

rs.Open "SELECT * FROM EPA2.txt", cnTxt, 3, 3, &H1

E' chiaro che la connessione si riferisce solo al file di testo... E'
possibile però trasferire in blocco i dati utilizzando un'altra
connessione (stavolta su SQLServer) ?
L'alternativa per me è scorrere il recordset rs e poi fare una
moltitudine di istruzioni di INSERT

while not rs.eof
cnSQLServer.execute "INSERT INTO ecc."
...

...sicuramente poco performante.

Grazie ancora.
Newcomsas
Lorenzo Benaglia
2006-11-30 12:32:40 UTC
Permalink
Post by Newcomsas
Non c'è per caso modo di usare un'istruzione di tipo SELECT * INTO per
travasare direttamente i dati contenuti nel txt in una tabella di SQL
Server ?
Se lo scopo è quello di importare i dati, utilizza bcp.exe od il comando
BULK INSERT studiati appositamente per questo genere di task.
Ogni dettaglio sui Books Online e nelle centinaia di post sull'argomento che
trovi in questo ng :-)
Post by Newcomsas
Grazie ancora.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Newcomsas
2006-11-30 10:53:11 UTC
Permalink
"Lorenzo Benaglia" ha scritto
Fai MOLTA ATTENZIONE all'ultimo ritorno a capo che DEVE ESSERE presente in
entrambi i files,
Esatto, la chiave del problema era proprio questa: inserendo il ritorno a
capo tutto funziona correttamente.
Ne approfitto per chiedere un'altra cosa (forse stavolta un po' eccessiva).
Non c'è per caso modo di usare un'istruzione di tipo SELECT INTO per
travasare direttamente i dati contenuti nel txt in una tabella di SQL Server
?
Mi spiego meglio: io genero un recordset del tipo

rs.Open "SELECT * FROM EPA2.txt", cnTxt, 3, 3, &H1

E' chiaro che la connessione si riferisce solo al file di testo... E'
possibile però trasferire in blocco i dati utilizzando un'altra connessione
(stavolta su SQLServer) ?
L'alternativa per me è scorrere il recordset rs e poi fare una moltitudine
di istruzioni del genere

while not rs.eof
cnSQLServer.execute "INSER INTO ecc."
...

sicuramente poco performante.

Grazie ancora.
Newcomsas
Newcomsas
2006-11-30 11:16:05 UTC
Permalink
"Lorenzo Benaglia" ha scritto
Fai MOLTA ATTENZIONE all'ultimo ritorno a capo che DEVE ESSERE presente in
entrambi i files,
Esatto, la chiave del problema era proprio questa: inserendo il ritorno a
capo tutto funziona correttamente.
Ne approfitto per chiedere un'altra cosa (forse stavolta un po' eccessiva).
Non c'è per caso modo di usare un'istruzione di tipo SELECT INTO per
travasare direttamente i dati contenuti nel txt in una tabella di SQL Server
?
Mi spiego meglio: io genero un recordset del tipo

rs.Open "SELECT * FROM EPA2.txt", cnTxt, 3, 3, &H1

E' chiaro che la connessione si riferisce solo al file di testo... E'
possibile però trasferire in blocco i dati utilizzando un'altra connessione
(stavolta su SQLServer) ?
L'alternativa per me è scorrere il recordset rs e poi fare una moltitudine
di istruzioni di INSERT

while not rs.eof
cnSQLServer.execute "INSERT INTO ecc."
...

...sicuramente poco performante.

Grazie ancora.
Newcomsas

Loading...