Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    ADOX: creare relazioni tra tabelle

    In realta ho due problemi, con ADOX come faccio ad impostare la proprietà "indicizzato" di un campo, per indicare se sono ammessi duplicati o meno?

    Successivamente, sempre lavorando con ADOX come realizzo una relazione tra due campi di due tabelle?

    Andrebbe bene anche trovare un Help di ADOX....

    Grazzie mille!!!

  2. #2

    Ho risolto l'indice

    Mi resta da chiarire come creare una nuova relazione tra due campi di due tabelle.

    Chi mi pnò indirizzare?

  3. #3
    Utente di HTML.it L'avatar di Corwin
    Registrato dal
    Jan 2002
    Messaggi
    584
    I don't wanna have to shout it out / I don't want my hair to fall out
    I don't wanna be filled with doubt / I don't wanna be a good boy scout
    I don't wanna have to learn to count / I don't wanna have the biggest amount
    I don't wanna grow up

  4. #4

    Grazie Mille

    Continuando a smanettare con gli oggetti di ADOX sono arrivato alla stessa soluzione.
    La cosa che mi ha spiazzato è che ragiona a ritroso, in una relazione di tipo "uno a molti" nella tabella secondaria devi aggiugere il riferimento alla tabella primaria.

    Ho trovato uno script per creare un DB al volo, funziona, sfrutta istruzioni sql per creare le tabelle.

    Il problema è che non puoi mettere due o più campi in chiave e non ti permette di creare relazioni.

    Mi sono messo a riscrivere il tutto utilizzando gli oggetti di ADOX e adesso dovrei essere in grado di creare un db da codice impostando tutte le caratteristiche.

    Se dovessi aver bisogno sai dove trovarmi.

  5. #5

    Non riesco a capire l'errore.....

    Sembra funzionare tutto tranne la creazione delle Relazioni....
    Ecco il codice dello script
    codice:
    <%
    const nonIndicizzato = 0
    const duplicatiAmmessi = 1
    const duplicatiNonAmmessi = 2
    
    Dim db' As DAO.DBEngine
    Dim adodbConn' As ADODB.Connection
    Dim adoxConn' As ADOX.Catalog
    
    Sub Entrata()
    	response.write("<center>CREA</center>")
    End Sub
    
    Sub CreateNewMDB(FileName)
        Set db = CreateObject("DAO.DBEngine.36")
        db.CreateDatabase FileName, ";LANGID=0x0409;CP=1252;COUNTRY=0", 64
        
        Set adodbConn = CreateObject("ADODB.Connection")
        adodbConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & FileName
     
        Set adoxConn = CreateObject("ADOX.Catalog")
        adoxConn.ActiveConnection = adodbConn
     
    
        'campiTabella1(0) = Array(NomeCampo, TipoCampo, SizeCampo, Chiave, Contatore, Indicizzato)
        Dim campitabella1(2)
        campitabella1(0) = Array("ID_GIRONI", adInteger, 3, False, True, duplicatiNonAmmessi)
        campitabella1(1) = Array("D_GIRONI", adVarWChar, 50, True, False, duplicatiNonAmmessi)
        campitabella1(2) = Array("PROSSIMO", adBoolean, 11, False, False, nonIndicizzato)
        Call CreaTabella("GIRONI", campitabella1)
    
        'campiTabella1(0) = Array(NomeCampo, TipoCampo, SizeCampo, Chiave, Contatore, Indicizzato)
        Dim campitabella2(3)
        campitabella2(0) = Array("ID_GIORNATE", adInteger, 3, False, True, duplicatiNonAmmessi)
        campitabella2(1) = Array("ID_GIRONI", adInteger, 3, True, False, duplicatiAmmessi)
        campitabella2(2) = Array("D_GIORNATE", adVarWChar, 50, True, False, duplicatiAmmessi)
        campitabella2(3) = Array("PROSSIMA", adBoolean, 11, False, False, nonIndicizzato)
        Call CreaTabella("GIORNATE", campitabella2)
    
        CreaRelazione "GIRONI", "ID_GIRONI", "GIORNATE", "ID_GIRONI"
    
        Set adoxConn = Nothing
        adodbConn.Close
        Set adodbConn = Nothing
        Set db = Nothing
    End Sub
    
    
    Sub CreaTabella(nomeTabella, campiTabella)
        Set objAdoxTable = CreateObject("ADOX.Table")       'Server.CreateObject("ADOX.Table")
        ' il nome della tabella...
        objAdoxTable.Name = nomeTabella
        
        For Each campo In campiTabella
            If campo(4) Then
                ' inseriamo il campo Contatore...
                Set objAdoxColumn = CreateObject("ADOX.Column")     'Server.CreateObject("ADOX.Column")
                Set objAdoxColumn.ParentCatalog = adoxConn
                With objAdoxColumn
                    .Type = adInteger
                    .Name = campo(0)
                    .Properties("Autoincrement") = True
                End With
                ' eseguiamo la creazione del campo Contatore...
                objAdoxTable.Columns.Append objAdoxColumn
                Set objAdoxColumn = Nothing
            Else
                objAdoxTable.Columns.Append campo(0), campo(1), campo(2)
            End If
        Next
        
        chiavi = False
        For Each campo In campiTabella
            If campo(3) Then
                chiavi = True
                Exit For
            End If
        Next
        
        If chiavi Then
            ' aggiungo i campi in chiave primaria
            Set idxNew = CreateObject("ADOX.Index")         'Server.CreateObject("ADOX.Index")
                With idxNew
                    .Name = "Chiavi"
                    For Each campo In campiTabella
                        If campo(3) Then
                            .Columns.Append campo(0)
                        End If
                    Next
                    .PrimaryKey = True
                End With
            objAdoxTable.Indexes.Append idxNew
        End If
        
    
        For Each campo In campiTabella
            If (campo(5) > 0) Then
                Set indice = CreateObject("ADOX.Index")
                With indice
                    .Name = "indice" & nomeTabella & campo(0)
                    If (campo(5) = 2) Then
                        .Unique = True
                    End If
                    .IndexNulls = adIndexNullsDisallow
                    .Columns.Append campo(0)
                End With
                objAdoxTable.Indexes.Append indice
                Set indice = Nothing
            End If
        Next
    
        adoxConn.Tables.Append objAdoxTable
        Set objAdoxTable = Nothing
    End Sub
    
    
    Sub CreaRelazione(tabellaPrimaria, campoPrimario, tabellaSecondaria, campoSecondario)
        Set chiavi = CreateObject("ADOX.Key")
        With chiavi
            .Name = "Relazione_" & tabellaPrimaria & "_" & campoPrimario & "_" & tabellaSecondaria & "_" & campoSecondario
            .Type = adKeyForeign
            .RelatedTable = tabellaPrimaria
            .UpdateRule = adRICascade
            .DeleteRule = adRICascade
            .Columns.Append campoSecondario
            .Columns(campoSecondario).RelatedColumn = campoPrimario
        End With
        adoxConn.Tables(tabellaSecondaria).Keys.Append chiavi
    
        Set chiavi = Nothing
    End Sub
    
    
    Select Case request.querystring("azione")
    	Case "CREA"			:	call CreateNewMDB(Server.MapPath("/mdb-database/databasediprova.mdb"))
    	Case Else			:	call Entrata
    End Select
    %>
    La cosa brutta è che mi da errore solo in asp, in vb funziona tutto.

  6. #6

    Ho aggiornato la sub per creare le relazioni

    ....m non credo che sia sufficente.
    Il nuovo code è il seguente:

    codice:
    Private Sub CreaRelazione(ByRef database, tabellaPrimaria, campoPrimario, tabellaSecondaria, campoSecondario)
        Set chiavi = CreateObject("ADOX.Key")
        With chiavi
            .Name = "Relazione" & tabellaPrimaria & "_" & campoPrimario & "_" & tabellaSecondaria & "_" & campoSecondario
            .Type = adKeyForeign
            .DeleteRule = adRICascade
            .UpdateRule = adRICascade
            .RelatedTable = tabellaPrimaria
            .Columns.Append campoSecondario
            .Columns(campoSecondario).RelatedColumn = campoPrimario
        End With
        database.Tables(tabellaSecondaria).Keys.Append chiavi
    End Sub

  7. #7
    La correzione è la seguente:
    codice:
    .Columns(campoSecondario).RelatedColumn = adoxConn.Tables(tabellaPrimaria).Columns(campoPrimario)
    al posto di
    codice:
    .Columns(campoSecondario).RelatedColumn = campoPrimario

  8. #8

    Alla fine sono riuscito a trovare l'errore!!!!

    Nel file "adovbs.inc" sono definite la maggior parte delle costanti, quando cercavo di settare le proprietà della relazione utilizzavo due costanti che in VB erano definite probabilmente in un altro file che non includevo.

    Alla fine ecco il codice pulito per creare al volo un DB con le sue tabelle, le sue chiavi primarie, gli indici e le relazioni!!!

    codice:
    <%
    const nonIndicizzato = 0
    const duplicatiAmmessi = 1
    const duplicatiNonAmmessi = 2
    
    const adRICascade = 1
    const adKeyForeign = 2
    
    Dim db' As DAO.DBEngine
    Dim adodbConn' As ADODB.Connection
    Dim adoxConn' As ADOX.Catalog
    
    Sub Entrata()
    	response.write("<center>CREA</center>")
    End Sub
    
    Sub CreateNewMDB(FileName)
        Set db = CreateObject("DAO.DBEngine.36")
        db.CreateDatabase FileName, ";LANGID=0x0409;CP=1252;COUNTRY=0", 64
        
        Set adodbConn = CreateObject("ADODB.Connection")
        adodbConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & FileName
     
        Set adoxConn = CreateObject("ADOX.Catalog")
        adoxConn.ActiveConnection = adodbConn
     
    
        'campiTabella1(0) = Array(NomeCampo, TipoCampo, SizeCampo, Chiave, Contatore, Indicizzato)
        Dim campitabella1(2)
        campitabella1(0) = Array("ID_GIRONI", adInteger, 3, False, True, duplicatiNonAmmessi)
        campitabella1(1) = Array("D_GIRONI", adVarWChar, 50, True, False, duplicatiNonAmmessi)
        campitabella1(2) = Array("PROSSIMO", adBoolean, 11, False, False, nonIndicizzato)
        Call CreaTabella("GIRONI", campitabella1)
    
        'campiTabella1(0) = Array(NomeCampo, TipoCampo, SizeCampo, Chiave, Contatore, Indicizzato)
        Dim campitabella2(3)
        campitabella2(0) = Array("ID_GIORNATE", adInteger, 3, False, True, duplicatiNonAmmessi)
        campitabella2(1) = Array("ID_GIRONI", adInteger, 3, True, False, duplicatiAmmessi)
        campitabella2(2) = Array("D_GIORNATE", adVarWChar, 50, True, False, duplicatiAmmessi)
        campitabella2(3) = Array("PROSSIMA", adBoolean, 11, False, False, nonIndicizzato)
        Call CreaTabella("GIORNATE", campitabella2)
    
        CreaRelazione "GIRONI", "ID_GIRONI", "GIORNATE", "ID_GIRONI"
    
        Set adoxConn = Nothing
        adodbConn.Close
        Set adodbConn = Nothing
        Set db = Nothing
    End Sub
    
    
    Sub CreaTabella(nomeTabella, campiTabella)
        Set objAdoxTable = CreateObject("ADOX.Table")       'Server.CreateObject("ADOX.Table")
        ' il nome della tabella...
        objAdoxTable.Name = nomeTabella
        
        For Each campo In campiTabella
            If campo(4) Then
                ' inseriamo il campo Contatore...
                Set objAdoxColumn = CreateObject("ADOX.Column")     'Server.CreateObject("ADOX.Column")
                Set objAdoxColumn.ParentCatalog = adoxConn
                With objAdoxColumn
                    .Type = adInteger
                    .Name = campo(0)
                    .Properties("Autoincrement") = True
                End With
                ' eseguiamo la creazione del campo Contatore...
                objAdoxTable.Columns.Append objAdoxColumn
                Set objAdoxColumn = Nothing
            Else
                objAdoxTable.Columns.Append campo(0), campo(1), campo(2)
            End If
        Next
        
        chiavi = False
        For Each campo In campiTabella
            If campo(3) Then
                chiavi = True
                Exit For
            End If
        Next
        
        If chiavi Then
            ' aggiungo i campi in chiave primaria
            Set idxNew = CreateObject("ADOX.Index")         'Server.CreateObject("ADOX.Index")
                With idxNew
                    .Name = "Chiavi"
                    For Each campo In campiTabella
                        If campo(3) Then
                            .Columns.Append campo(0)
                        End If
                    Next
                    .PrimaryKey = True
                End With
            objAdoxTable.Indexes.Append idxNew
        End If
        
    
        For Each campo In campiTabella
            If (campo(5) > 0) Then
                Set indice = CreateObject("ADOX.Index")
                With indice
                    .Name = "indice" & nomeTabella & campo(0)
                    If (campo(5) = 2) Then
                        .Unique = True
                    End If
                    .IndexNulls = adIndexNullsDisallow
                    .Columns.Append campo(0)
                End With
                objAdoxTable.Indexes.Append indice
                Set indice = Nothing
            End If
        Next
    
        adoxConn.Tables.Append objAdoxTable
        Set objAdoxTable = Nothing
    End Sub
    
    
    Sub CreaRelazione(tabellaPrimaria, campoPrimario, tabellaSecondaria, campoSecondario)
        Set chiavi = CreateObject("ADOX.Key")
        With chiavi
            .Name = "Relazione_" & tabellaPrimaria & "_" & campoPrimario & "_" & tabellaSecondaria & "_" & campoSecondario
            .Type = adKeyForeign
            .RelatedTable = tabellaPrimaria
            .UpdateRule = adRICascade
            .DeleteRule = adRICascade
            .Columns.Append campoSecondario
    		.Columns(campoSecondario).RelatedColumn = adoxConn.Tables(tabellaPrimaria).Columns(campoPrimario)
        End With
        adoxConn.Tables(tabellaSecondaria).Keys.Append chiavi
        Set chiavi = Nothing
    End Sub
    
    
    Select Case request.querystring("azione")
    	Case "CREA"			:	call CreateNewMDB(Server.MapPath("/mdb-database/databasediprova.mdb"))
    	Case Else			:	call Entrata
    End Select
    %>
    Chiunque avesse in mente eventuali implementazioni sono disponibile!!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2002
    Messaggi
    1,183
    ciao ragazzi,
    la vostra discussione è proprio quella che interessa a me.

    So già come si crea un db access nuovo con adox.

    Mi fareste un semplicissimo esempio su come si crea la relazione tra due tabelle da asp e sempre con adox

    grazie
    victor
    ----------------------

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2002
    Messaggi
    1,183

    ciao ragazzi, mi date un aiutino

    ciao
    sono riuscito a creare un db con tabelle e RELAZIONI.
    Il mio problema è che le relazioni vengono create con solo INTEGRITA' REFERENZIALE....vorrei fare in modo che venissero create relazioni con INTEGRITA' REFERENZIALE, CAMPI CORRELATI A CATENA, ELIMINA RECORD CORRELATI

    Grazie
    victor
    ----------------------

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.