+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 9 su 9

Rilevare la dimensione dei campi da un database Access/SQL

  1. #1
    Ciao a tutti.

    ho necessità di rilevare il tipo di campo e la sua dimensione dalle colonne di un database caricato in un un bindingSource.
    lo scopo è di rilevare la dimensione dei campi (Testo e numerico) per applicarli alle proprietà dei vari controlli.
    Il codice successivo carica i vari campi del DataAdapter su un BindingSource a cui sono associati vari controlli speciali (estesi) da mé costruiti. questi controlli dispongono di proprietà InputMaxLength per la dimensione un campo Testo e di una proprietà DecimalPlaces per un campo numerico. So che il bindingSource dispone già di questi parametri ma non so come estrarli e applicarli ai controlli.

           
            ' COLLEGA BINDING AL DATASET SULLA TABELLA USERLIST(LISTA UTENTI) 
            With bsUtenti
                .DataSource = Dati.ds
                .DataMember = Tabella
                .Sort = PKey & " ASC" ' Ascendente (" DESC" Discendente)
            End With
            ' associa controlli
            txtUtente.DataBindings.Add("InputText", bsUtenti, "Utente")
            txtIDUtente.DataBindings.Add("InputText", bsUtenti, "IDUser")
            cboLivello.DataBindings.Add("SelectedIndex", bsUtenti, "Livello")
            txtDescrizione.DataBindings.Add("InputText", bsUtenti, "Descrizione")
            chkIsActive.DataBindings.Add("Checked", bsUtenti, "IsActive")
            chkDataSistema.DataBindings.Add("Checked", bsUtenti, "AvvioConDtSistema")
            txtSocieta.DataBindings.Add("InputText", bsUtenti, "Societa")
            txtOldPw.DataBindings.Add("InputText", bsUtenti, "Password")
            chkFlagVarFido.DataBindings.Add("Checked", bsUtenti, "Flagvarfido")
            chkFlagSbloccoFido.DataBindings.Add("Checked", bsUtenti, "Flagsbloccofido")
    
    Un qualsiasi aiuto è gradito.

  2. #2
    Scusa ma non credo di aver capito bene il quesito.

    Cosa intendi per ricavare tipo e dimensione ?

    Non sai già a priori che un determinato campo del database è ad esempio di tipo char di N caratteri ?
    Oppure che é un decimale a 2 cifre o un intero etc.. etc.. ?

    Perché devi ricavarlo via codice ?

    Molto probabilmente però non ho capito io la domanda.
    ℹ️ Leggi di più su Fix ...

  3. #3
    Scusa Fix, sicuramente non mi sono spiegato bene io.

    Premetto che tutto questo nasce dal fatto che dovrei utilizzare dei Controlli altamente specializzati (da me costruiti) per gestire input controllati. Per controllati intendo che per ogni tipo di input che si desidera (Testo, password,Numerico, Data,Ora,Codice IVA, Codice Fiscale e Tipo personalizzato) il Controllo permette solo l'inserimento di caratteri specifici, ne controlla la lunghezza, il formato e ne verifica eventualmente la congruità.
    Per ottenere tutte queste funzionalità, questi Controlli dispongono delle seguenti proprietà:
    InputType che definisce il tipo di campo da gestire
    (può essere Normal,Upper,Password,Numeric,Data,Ora,PIva,CFisc)
    InputText riceve e tratta il contenuto
    InputMaxLength definisce la dimensione del campo (0 o 32767 lunghezza)
    DecimalPlaces Definisce il numero di decimali

    Queste proprietà possono essere gestite in modalità DesignTime dal programmatore o in modalità Runtime durante l'esecuzione del programma. E qui casca l'asino.
    Considerando Connection e DataAdapter gia eseguiti, collego la tabella interessata al database tramite un BindingSource (bsUtenti) e ogni controllo interessato a ciascun campo del database tramite la proprietà InputText.
    ' COLLEGA BINDING AL DATASET SULLA TABELLA USERLIST(LISTA UTENTI) 
    With bsUtenti
        .DataSource = Dati.ds
        .DataMember = Tabella
        .Sort = PKey & " ASC" ' Ascendente (" DESC" Discendente)
    End With
    ' associa controlli
    txtUtente.DataBindings.Add("InputText", bsUtenti, "Utente")
    txtIDUtente.DataBindings.Add("InputText", bsUtenti, "IDUser")
    cboLivello.DataBindings.Add("SelectedIndex", bsUtenti, "Livello")
    txtDescrizione.DataBindings.Add("InputText", bsUtenti, "Descrizione")
    chkIsActive.DataBindings.Add("Checked", bsUtenti, "IsActive")
    chkDataSistema.DataBindings.Add("Checked", bsUtenti, "AvvioConDtSistema")
    txtSocieta.DataBindings.Add("InputText", bsUtenti, "Societa")
    txtOldPw.DataBindings.Add("InputText", bsUtenti, "Password")
    chkFlagVarFido.DataBindings.Add("Checked", bsUtenti, "Flagvarfido")
    chkFlagSbloccoFido.DataBindings.Add("Checked", bsUtenti, "Flagsbloccofido")
    
    Al momento, il controllo delle dimensioni dei campi è definito in modalità DesignTime tramite valore inserito manualmente nella proprietà InputMaxLength di ciascun Controllo ma quello che vorrei fare è rilevarlo direttamente dal database e inserirlo in modalità Runtime.
    So che lo schema del database è gia disponibile però non so come recuperarne i dati relativi alla dimensione e al numero di decimali.

    Spero di essere stato esauriente. Se hai bisogno di indicazioni più precise ti posso inviare il manuale d'utilizzo del /dei controllo/controlli. A risentirci

  4. #4
    Sembrerebbe che la soluzione più idonea sia l'utilizzo di: DataTableReader.GetSchemaTable in quanto alcune informazioni non sono ricavabili dal DataSet (link ad un quesito simile per ricavare NumericPrecision e NumericScale)

    Visto che il BindingSource è agganciato al DataSet presumo che non sia possibile Bindare queste informazioni.

    Esiste anche la Classe ListBindingHelper che con i metodi GetListItemType e GetListItemProperties ti restituisce i tipi e le proprietà degli elementi, ma restituendoti elementi forniti dal DataSet non so fino a che punto possa essere utile.
    ℹ️ Leggi di più su Fix ...

  5. #5
    Grazie Fix, Purtroppo nessuna delle soluzioni che mi hai proposto funzionja correttamente.

    Mi rendo conto che probabilmente non è non è una soluzione facile ma che sia cos' difficile rilevare i parametri dei vari campi in un database mi sembra una assurdità.
    Nel volume "Programmare Microsoft ADO.NET 2.0" si parla di utilizzare il DataReader, chiamare GetFieldType per ottenere il tipo di dato. ebbene riesco ad ottenere solo il tipo (String,Boolean,Int32 ecc.) ma non ce alcun modo per ottenerne il valore.
    oltre tutto mi sembra assurdo rieseguire un'ulteriore DataReader quando questo è già stato effettuato dal DataAdapter. mi sembra del lavoro in più.
    Consultando la tabella interessata, da Visual Studio tramite "Esplora Server", ad ogni singolo campo vengono visualizzati i singoli valori che mi interessano nel riquadro delle Proprietà. Possibile che non ci sia modo di prelevare questi dati solo per i campi interessati.

    Grazie ancora per l'interessamento.

  6. #6
    Non ho modo di provare adesso ma hai seguito i passaggi del link Microsoft ?

    Come ad esempio impostare adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey e poi leggere dal reader i dati dello schema ?

    Quando dici che “non funziona” cosa intendi ? Hai errori ? Quali ?
    ℹ️ Leggi di più su Fix ...

  7. #7
    Puoi usare sempre ADOX (per Access è più opportuno (il codice DataTableReader.GetSchemaTable è tarato su SQL Server e usato con Access non restituisce molte informazioni coerenti).

    Ad esempio, un riepilogo di quello che offre ADOX

            Dim strConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TuoDB.accdb"  ' Da personalizzare
            Dim con As ADODB.Connection = New ADODB.Connection()
            con.ConnectionString = strConn
            con.Open()
    
            Dim cat As New ADOX.Catalog
            cat.ActiveConnection = con
    
            For Each tbl As ADOX.Table In cat.Tables
                If tbl.Name = "Test" Then
                    Console.WriteLine("TABLE: {0}", tbl.Name)
                    For Each col As ADOX.Column In tbl.Columns
                        Console.WriteLine("   {0} ({1}) Defsize:{2} Precision:{3}", col.Name, col.Type, col.DefinedSize, col.Precision)
                        For Each pro As ADOX.Property In col.Properties
                            Console.WriteLine("      {0} : [{1}]", pro.Name, pro.Value)
                        Next
                    Next
                    Console.WriteLine()
                End If
            Next
    
    ℹ️ Leggi di più su AntonioG ...

  8. #8
    Visto che piove ho fatto una prova

    Utilizzando l'esempio di Microsoft, con un DataTableReader, in effetti si recupera solo il "MaxLength" (ColumnSize) ma niente NumericPrecision e NumericScale per i tipi numerici.

    Usando invece un OleDbDataReader, si riescono a recuperare.

    Questo è il risultato estratto con il DataTableReader
    Spoiler: DataTableReader Result 

    Mentre questo è il risultato con OleDbDataReader
    Spoiler: OleDbDataReader Result 


    E questo è il codice usato con OleDbDataReader ed un DB di test ACCESS
            Dim ConncetionSgring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=PATHDB\Northwind2007.accdb;Persist Security Info=False;"
            Try
                Using dBConnection As New OleDbConnection(ConncetionSgring)
                    Dim dBCommand As New OleDbCommand("Select * From Clienti", dBConnection)
                    dBConnection.Open()
                    Using reader As OleDbDataReader = dBCommand.ExecuteReader()
                        Dim schemaTable As DataTable = reader.GetSchemaTable()
    
                        For indexCol = 0 To schemaTable.Columns.Count - 1
                            Dim row As DataRow = schemaTable.Rows(indexCol)
                            For Each col As DataColumn In schemaTable.Columns
                                Console.Write(" - {0}: {1}", col.ColumnName, row(col.Ordinal))
                            Next
                            Console.WriteLine()
                        Next
    
                    End Using
                    dBConnection.Close()
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    


    crossposting con Antonio ! sorry
    ℹ️ Leggi di più su Fix ...

  9. #9
    Nessun problema Fix ... due metodi sono meglio di "one" ... :-)

    Dimenticavo ... con ADOX (e un db di test) si ottiene il seguente risultato

    Spoiler: ADOX 


    Notare l'ultimo campo con Jet OLEDB:Hyperlink : [True] ...
    ℹ️ Leggi di più su AntonioG ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Rilevare cambiamento campi testo in una userform
    Da ginopizza nel forum Microsoft Excel
    Risposte: 4
    Ultimo Post: 08-09-2013, 16:22
  2. [VB2010] Leggere valori da campi in Database Access
    Da great_mirko nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 05-02-2013, 22:00
  3. struttura database, dimensione campo
    Da spizzi nel forum Microsoft Access
    Risposte: 4
    Ultimo Post: 27-01-2011, 11:35
  4. [VBA] campi a dimensione variabile nei report
    Da stige nel forum Microsoft Word
    Risposte: 5
    Ultimo Post: 15-01-2010, 16:09
  5. Rilevare versione access in uso
    Da willysmb nel forum Microsoft Access
    Risposte: 3
    Ultimo Post: 16-01-2007, 14:33