1 messaggio dal 27 agosto 2021
Quando cerco di leggere i campi di una tabella da un database, già in fase di progettazione mi segnala che Durante la conversione da 'ADODB.Fields' a 'String' si potrebbero verificare errori di runtime, ed effettivamente all'atto della lettura con:
Mid(RecFile, 1, 18) = rs.Fields("codice")
mi restituisce un errore, dove sbaglio?
di seguito il codice completo:


Module LIReadMySql
'
' Gestione Database MySql tramite Driver ODBC
' Legge Database e genera file di testo
'
Dim Cn As New ADODB.Connection
Dim CnA As New ADODB.Connection
Dim CnP As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strTable As String
Dim RecFile As String
Dim Linea As String
Dim Msg As String

Sub Main()
On Error GoTo ErrorHandler ' Attiva la routine di gestione degli errori.

'Connessione Diretta a Microsoft SQL Server
' Cn.ConnectionString = Data Source=BUSC-NB\SQLEXPRESS; Database=PROVA;User ID=sa;Password=Logol"

'Connessione Diretta a ODBC
Cn.ConnectionString = "Data Source=MySql_Prova;database=logol;User id=root; password=Logol; port=3306"
' oppure
'Cn.ConnectionString = "DSN=MySql_Prova" ' Connessione Tramite ODBC MySql con il Data Source Name
Cn.Open() 'Apre connessione a Database

' Apro File Txt
FileOpen(1, "c:\tmp\ArticoliMySql.txt", OpenMode.Output) ' Apro file TXT
'
LeggiTabella() 'Legge Tabella MYSql e scrive file Ascii
'
Cn.Close() ' Chiude Database
Cn = Nothing
'
FileClose(1) 'Chiudo file TXT
End
'
ErrorHandler: ' Routine di gestione degli errori 1.
Select Case Err.Number ' Valuta il numero di errore.
Case 53 ' Errore "File Non Trovato".
Msg = "File di testo non trovato Esecuzione Terminata"
MsgBox(Msg)

Case Else
' Gestisce altre situazioni...
Msg = "Errore " & Str(Err.Number) & " generato da " _
& Err.Source & Chr(13) & Err.Description
' MsgBox(Msg, , "Errore", Err.HelpFile, Err.HelpContext)
MsgBox(Msg)

End Select
Err.Clear() ' Cancella i campi dell'oggetto.
'
End
End Sub
'
Private Sub LeggiTabella()

' Recordset.Open(Source, Connection, CursorType, LockType, CommadType)

'Source : indica la tabella o la query della tabella da trattare
'Connection : è un oggetto connessione o una stringa che contiene le informazioni
' relative alla connessione
'CursorType : indica la modalità di spostamento all'interno del recordset.
'LockType : determina la modalità di scrittura nella tabella
'CommandType : indica come valutare il precedente parametro:
' "AdCmdTable" obbligatorio quando source indica una tabella.

'Definizione di CursorType
'-------------------------
'0 - cursore di default - permette spostamenti solo in avanti e non tiene traccia dei
' rk aggiunti, modificati o cancellati da altri utenti.
'1 - KeySet - permette spostamenti avanti e indietro e permette di vedere
' i rk modificati ma non quelli aggiunti p cancellati.
'2 - Cursore dinamico - permette qualsiasi spostamento e permette di vedere
' qualsiasi modifica, aggiunta o cancellazione di rk.
'3 - Cursore Statico - permette qualsiasi spostamento ma non rileva modifiche ai
' dati apportate da altri utenti.

'Definizione di LockType
'-----------------------
'1 - AdLockReadOnly - i dati possono essere solo letti
'2 - AdLockPessimistic - i dati vengono bloccati appena un utente inizia ad
' effettuare operazioni di modifica e restano bloccati finchè
' tali operazioni non siano concluse.
'3 - AdLockOptimistic - dati vengono protetti dalle modifiche degli altri utenti
' solo nel momento in cui viene lanciato un programma di
' aggiornamento (update).

' Apro Tabella logol_tab01
strTable = "logol_tab01"
rs.Open(strTable, Cn, 1, 1, )

' Leggo Tabella logol_tab01
'
rs.MoveFirst()
Do
If Not rs.EOF Then
RecFile = ""
'RecFile = rs.GetString(2, 1, , , )
Mid(RecFile, 1, 18) = rs.Fields("codice")
'Mid(RecFile, 19, 40) = rs("Descrizione")
'Mid(RecFile, 59, 2) = rs.Fields("UNM")
'Mid(RecFile, 61, 2) = CStr(rs("Prezzo"))
' ' Questa istruzione evita l'errore 94 se il campo è NULL
' ' Mid(RecFile, 59, 2) = IIf(IsNull(rs!un_mis), "", rs!un_mis)
' '
Print(1, RecFile) 'Scrivo File Txt
rs.MoveNext() ' Leggo Record Successivo NON USARE CON GetString
Else
rs.Close() ' Chiudo Tabella logol_tab01
Exit Do
End If
Loop
'
End Sub

End Module
82 messaggi dal 19 ottobre 2005
dev.to
Credo tu stia facendo un po' di confusione.

Allora, Mid è una funzione di VB con la quale puoi estrarre da una stringa una sottoscritta mentre Fields è una collection dell'oggetto RecordSet che, nel tuo caso specifico, ti restituisce un oggetto di tipo Field contenente la colonna codice. Se non ricordo male l'oggetto Field ha la proprietà Value (che è di tipo Variant quindi ti conviene fare un cast con il metodo CStr).
Però non puoi assegnare il valore di alla funzione Mid. Devi dichiararti una stringa

Dim sCodice As String

sCodice = CStr(rs.Fields("codice").Value)


Ciao.
Modificato da santoni1981 il 28 agosto 2021 00:21 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.