Leggere con VB6 le proprietà dei campi Access

giovedì 29 maggio 2008 - 11.52

Franto Profilo | Junior Member

Ciao a tutti, ho la necessità di sapere che tipo di formato (intero, stringa, data, ...) ha il campo che sto trattando. In rete ho trovato questo :

Dim vDBase As ADODB.Connection
Dim vTable As ADODB.Recordset
Dim vField As Field

Dim vStTmp1 As String
Dim i As Integer

Set vDBase = New ADODB.Connection
vDBase.CursorLocation = adUseServer
vDBase.Open "Provider = Microsoft.Jet.OLEDB.4.0; Jet OLEDB:Database Password = " & "; Data Source = " & pDBPath

Set vTable = New ADODB.Recordset
vTable.CursorLocation = adUseServer
vTable.Open pTable, vDBase, adOpenKeyset, adLockOptimistic, adCmdTable

Set vField = vTable.Fields(pField)
vStTmp1 = vTable.Fields(pField).Attributes

For i = 0 To vField.Properties.Count - 1
vStTmp1 = vField.Properties(i).Name & "=" & vField.Properties(i).Value
Next i

Ma mi restituisce solo queste info : COLLATINGSEQUENCE, ISCASESENSITIVE, ISAUTOINCREMENT, BASETABLENAME, BASECOLUMNNAME

Sapete darmi una mano??

Grazie,


--------------------------------------------------------------
Il destino è solo una giustificazione a ciò che è accaduto, che accade e che accadrà. Apriamo gli occhi e riprendiamoci la nostra vita.

assiolle Profilo | Junior Member

"Googlando" () un pò ho trovato questo codice, credo sia abbastanza datato, mi pare si basi su DAO.
Ma magari può esserti utile come spunto...

Dim dbTemp As Database Dim tdfTemp As TableDef Set dbTemp = OpenDatabase(Path & "Database.mdb") Set tdfTemp = dbTemp.TableDefs!Tabella For i = 0 To .Fields.Count - 1 MsgBox .Fields(i).Type ' Visualizza la tipologia del campo Next i


Alessio
http://blogs.dotnethell.it/alessiop

Dainesi Profilo | Senior Member

Hai sbagliato approccio! Non devi interrogare il recordset reale ma bensì il recordset Schema della tabella.

Recordset = Conection.OpenSchema(QueryType, [Criteria], [SchemaID])

dove Criteria è una costante di tipo SchemaEnum che nel tuo caso dovrebbe essere adSchemaColumns.
Una volta aperto il recordset esamini i soli record il cui campo "TABLE_NAME" è uguale alla tabella che cerchi.

Se cicli con un

For i = 0 to rc.Fields.Count-1
Debug.Print rc.Fields(i).Name
Next

Otterrai l'elenco di tutte le proprietà dei campi elencate in questo recordset
Avrai informazioni anche utilizzando adSchemaIndexes e adSchemaPrimaryKeys e adSchemaTables

Franto Profilo | Junior Member

Ciao Dainesi, grazie x l'intervento.
Ho provato ad aprire la mia connessione con .OpenSchema adSchemaColumns, ma interrogando la tabella non riesco a trovare la property che mi ritorni il tipo di dato (Stringa, Numerico, Data, ecc...)

Invio di seguito il codice che uso per aprire Database, Tabella e x interrogare le properties:

' Apro la connessione al Database
Set vDBase = New ADODB.Connection
vDBase.CursorLocation = adUseServer
vDBase.Open "DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=dbBellasio;UID=root;PWD=franto;OPTION=3"
vDBase.OpenSchema adSchemaColumns

' Apro la tabella
Set vTable = New ADODB.Recordset
vTable.CursorLocation = adUseServer
vTable.Open pTable, vDBase, adOpenKeyset, adLockOptimistic, adCmdTable

For i = 0 To vTable.Fields(pField).Properties.Count - 1
Debug.Print vTable.Fields(pField).Properties(i).Name & "=" & vTable.Fields(pField).Properties(i).Value
Next i
.....
.....

Dove sbaglio??



--------------------------------------------------------------
Il destino è solo una giustificazione a ciò che è accaduto, che accade e che accadrà. Apriamo gli occhi e riprendiamoci la nostra vita.

Dainesi Profilo | Senior Member

OpenSchema ritorna un Recordset, ecco dove sbagli.

Errato
vDBase.OpenSchema adSchemaColumns

Corretto
Set rc = vDBase.OpenSchema(adSchemaColumns)

Poi dopo cicli il Recordset ottenuto per trovare i campi della tabella che ti interessa
Do until rc.EOF
If rc("TABLE_NAME") = pTable then
Debug.Print rc("COLUMN_NAME")
SELECT CASE rc("DATA_TYPE")
CASE = 20 : Debug.Print " BigInt"
CASE = 128 : Debug.Print " Binary"
...
CASE 130 : Debug.Print " WCHAR"
CASE ELSE : Debug.Print " Unknown"
END SELECT
'Se poi è di tipo stringa vediamo la lunghezza
Debug.Print rc("CHARACTER_MAXIMUM_LENGHT")
End If

Loop
rc.Close

Per i valori di adDataTypeEnum cerca nell'Help in linea o nei reference della libreria ADO
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5