Newsgroup: it.comp.lang.visual-basic
Titolo: rilevare automaticamente la chiave primaria

Qualcuno sa se con vb6 è possibile recuperare la chiave primaria di una
tabella che fa parte di un db mysql???
Grazie 1000!!!
Yuri
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Grazie 1000!!!
immagino che ti connetti al db attraverso ODBC. Fossi in te userei ADOX, che
ti permette di esaminare la struttura di un db, indipendentemente dal db che
ci sta dietro. fai cosě:
apri una connessione dbConn come adodb.connection
istanzia un oggetto dbStruct come adox.catalog
assegna dbStruct.ActiveConnection = dbConn
adesso puoi ciclare tutti i campi della tabella
for each dbField in dbStruct.Tables(nomeTabella).Columns
    msgbox dbField.Properties("Autoincrement")
Next
prova, dovrebbe andare.....ho scritto senza provare, ma dovremmo esserci!!!
:-)
good coding!!!
-- 
Alletun
Sorry, ask me if you want to get my e-mail!

 adesso puoi ciclare tutti i campi della tabella
č quello che avevo pensato anche io,ma nn essendo molto pratico ho gogglando
un pochino e ho anche trovato qst codice(che nn funziona...sob) che č molto
simile alla tua soluzione
Public Function FindPK(TableName As String) As Variant
Dim cat As new ADOX.Catalog, key As new ADOX.key, tbl As new ADOX.Table, col
As new ADOX.Column
Set cat = New ADOX.Catalog
cat.ActiveConnection = cn
Set tbl = cat.Tables(TableName)
For Each key In tbl.Keys
If key.Type = adKeyPrimary Then
FindPK = key.Name
For Each col In key.Columns
Debug.Print "Column Name = " & col.Name
Next col
Exit Function
End If
FindPK = Null
Next key
End Function
Secondo me manca qualche inizializzazione...mi sbaglio???
Grazie1000


  ho gogglando un pochino
E' cosa buona e giusta! :-)
Adesso invece cerca nell'help cosa ti viene detto sul metodo OpenSchema di
ADODB.Connection...
Non mi ricordo il parametro giusto, ma una volta trovato ti rende un
recordset con tutte le chiavi primarie che vuoi...
    Ciao
        Allanon
-- 
- SPAMKILLER
 lasciate il NOSPAM nell'indirizzo: 
itlangv...@michele.sytes.net
 e lasciate la parola SPAMKILLER nel corpo dell'email

 End Function
mah, il codice sembra giusto, così a occhio. Cosa esattamente non va?
il codice qui sopra ha lo scopo di ciclare tutti gli indici della tabella
passata come parametro. Per ogni indice, visualizza nella finestra di debug
le colonne (ovvero i campi) su cui è applicato quell'indice. Controllo nei
riferimenti di aver messo ADOX (Microsoft ADO Ext. 2.8 for DLL and
Security).....
forse, banalmente, ed è cmq un metodo che non mi piace, potresti vedere
quando key.Name = "PrimaryKey", ma non farlo, assolutamente, potrebbe
cambiare da db a db.
ma scusa, dov'è esattamente il problema? non ti basta intercettare key.Type
= adKeyPrimary ?


 = adKeyPrimary ?
l'errore che da è: object or provider is not capable of performing the
requested operation.
Ora sto guardando un po la Openschema...il parametro da passargli è
adSchemaPrimaryKeys...ora provo e poi vi farò sapere!!
Grazie 1000!
Yu


 
Questa è la funzione che ho usato su un wrapper per la classe Recordset.
Non ricava l'indice primario ma tutti i campi relativi all'indice con il 
nome indicato, ma credo che per il primario sia banalmente da eliminare 
dalla WHERE il nome del campo chiesto e sostituira la costante adSchema...
Public Property Let Index(ByVal Value As String)
     Dim objLIndex As adodb.Recordset
     Dim lngLCount As Long
     Set objLIndex = objMDataBase.Connection.OpenSchema(adSchemaIndexes)
     objLIndex.Filter = "TABLE_NAME = '" & objMRecordset.Source & "' AND 
INDEX_NAME = '" & Value & "'"
     objMRecordset.Index = Value
     ReDim straMIndexFields(0 To objMRecordset.RecordCount)
     Do While Not objLIndex.EOF
         straMIndexFields(lngLCount) = objLIndex.Fields("COLUMN_NAME")
         lngLCount = lngLCount + 1
         objLIndex.MoveNext
     Loop
End Property
Testato solo su DB Access :( ma se il provider supporta la richiesta 
anche mySQL dovrebbe funzionare così.
Ciao

 anche mySQL dovrebbe funzionare cosě.
Testato su Access 2000, SQL Server e MySQL... ma senza clausola where (non
l'ho mai usata, magari funziona...).


 l'ho mai usata, magari funziona...).
Hai testato la mia procedura?
Cosa intendi con "senza clausola where"?
Ciao

 Cosa intendi con "senza clausola where"?
Pardon, senza clausole nel filtro... fino ad ora ho sempre dovuto analizzare
interi database.


Rieccomi!
Credo di aver trovato la soluzione
Dim cat As ADOX.Catalog,tbl As ADOX.table
 
    Set cat = New ADOX.Catalog
    cat.ActiveConnection = conn
    Set tbl = cat.Tables("table")
 
    For i = 0 To tbl.Columns.Count - 1
        If (tbl.Indexes(i).PrimaryKey) Then
               Debug.Print tbl.Indexes(i).Name
        End If
 
    Next i
Cosě quando rileva una chiave primaria stampa PRIMARY.... :)
grazie a tutti per l'aiuto!
