Creare un file db.accdb

di il
32 risposte

32 Risposte - Pagina 2

  • Re: Creare un file db.accdb

    11/01/2023 - oregon ha scritto:


    Certo che so qual è il problema, volevo solo darti una mano in più. Evidentemente non la vuoi

    Scusami ma è evidente che vuoi solo fare polemica. Se sai quale è il problema come hai scritto, perché non lo rendi pubblico al forum. Serve per questo. Serve per condividere le soluzioni. Non sei tu a dovermi dire se rivolgermi ad un professionista. Se non vuoi essere utile per la discussione non ti intromettere. Buona giornata

  • Re: Creare un file db.accdb

    Non ti preoccupare, per me discussione chiusa.

    Se uno ti dà un consiglio diverso da quello che stai facendo, lo puoi esaminare, eventualmente rispondere educatamente indicando che per ora ti basta la soluzione al codice anche se vedrai come migliorare il progetto. Esattamente quello che ti hanno suggerito TUTTI.

    Ma se per primo tu fai polemica con la questione dei “professori” allora arrangiati. 

  • Re: Creare un file db.accdb

    11/01/2023 - oregon ha scritto:


    Non ti preoccupare, per me discussione chiusa.

    Se uno ti dà un consiglio diverso da quello che stai facendo, lo puoi esaminare, eventualmente rispondere educatamente indicando che per ora ti basta la soluzione al codice anche se vedrai come migliorare il progetto. Esattamente quello che ti hanno suggerito TUTTI.

    Ma se per primo tu fai polemica con la questione dei “professori” allora arrangiati. 

    Continui a non dare la soluzione (che affermi di avere) al problema. Non penso che tu sia un professore.

  • Re: Creare un file db.accdb

    Qui è spiegato come creare un file accdb ma è richiesto Access sul PC:
    https://social.msdn.microsoft.com/Forums/en-US/5711484a-1c5b-4550-aada-d3c849d08d58/how-to-create-a-access-database-from-vb-code?forum=vbgeneral

    Lo potresti scrivere anche in binario sul disco prendendo il file vuoto che hai e incorporandone i byte nel tuo codice ma… avrebbe senso?

    Ovviamente no, come ti hanno detto tutti ha più senso quello che fai ora con il file già fatto copiato e rinominato.

    E ti prego, abbassa i toni

  • Re: Creare un file db.accdb

    Finalmente mi hai scritto qualcosa inerente il problema. Ti ringrazio, certo che so che quello che già faccio va bena, ma volevo esplorare altre soluzioni. Se non sbaglio non imparo. Guardo il link e vedo se ci capisco qualcosa. Grazie

  • Re: Creare un file db.accdb

    Non penso che tu sia un professore.

    Nessuno ti ha detto che lo sia, lo hai usato tu solo in senso dispregiativo. 

    Continui a non dare la soluzione (che affermi di avere)

    Il problema è banale, la soluzione pure. Non la avrai da me sicuramente, forse correggerà tutto il codice qualcun altro, forse ti dovrai rivolgere a qualcuno a pagamento (come penso sia corretto).

    Ripeto, per me discorso chiuso.

  • Re: Creare un file db.accdb

    11/01/2023 - fabio1974it ha scritto:


    Ciao, io adesso faccio precisamente quello che hai descritto, ho un file modello vuoto che copio e rinomino, e va bene. Il file modello l'ho messo nelle risorse del programma.

    Perfetto.

    11/01/2023 - fabio1974it ha scritto:


    Adesso che ho un po di esperienza in più, vorrei non dover avere un modello, ma creare un file da zero.

    Scusa, ma qual è la differenza rispetto all'avere un file che parte da zero come modello?

    11/01/2023 - fabio1974it ha scritto:


    L'applicazione che sto facendo subisce delle modifiche in base alle esigenze e mi capita di dover fare delle tabelle diverse.

    Come ho scritto nella mia risposta precedente, non è indispensabile che il “database modello” contenga già delle tabelle: quelle le puoi creare a runtime con zero sforzo. E' il file di database vuoto in sé il reale problema, ma ti basta usare un database vuoto come modello di partenza e il gioco è fatto.

    11/01/2023 - fabio1974it ha scritto:


    Non so se è meglio, ma volevo provare.

    NON è senz'altro meglio, in quanto

    • devi basarti su una dipendenza aggiuntiva,
    • devi scrivere il codice necessario,
    • non comporta alcun vantaggio evidente.

    11/01/2023 - fabio1974it ha scritto:


    Ho usato il comando che sta nel codice, e riesco a crearlo, ma rimane in uno stato che non permette modifiche e quindi non riesco a creare le tabelle.
    Se poi chiudo il programma e lo riapro le modifiche riesco a farle.

    Per forza: come detto sopra, stai usando un oggetto “estraneo” al mondo .NET (DAO) per creare un database, operazione che peraltro - come dice la documentazione stessa - apre il database, ed è quindi normale che tu non possa intervenire con modifiche a un database creato e aperto in esclusiva. E' necessario chiudere il database prima di procedere (vedi l'apposito metodo, che tu non invochi).

    Questo si porta dietro tante possibili problematiche: DAO deve essere presente, così come il driver per Access, la versione deve essere quella in uso sulla tua macchina, ecc. e il tutto per non creare banalmente la copia di un database vuoto su disco, operazione che potresti eseguire nativamente usando solo .NET senza bisogno di riferimenti esterni e obsoleti.

    11/01/2023 - fabio1974it ha scritto:


    Ho controllato lo stato della connessione, ma risulta chiusa

    Stai controllando lo stato della connessione al database usando un oggetto diverso da quello che effettivamente sta aprendo la connessione.

    Come detto sopra, c'è una commistione di due librerie, DAO (legacy) e ADO.NET, che agiscono su un database che viene creato ma non chiuso per eseguire nel modo più complesso una operazione che sarebbe banale, meno “error prone”, decisamente più rapida e anche portabile.

    Contento tu! :)

  • Re: Creare un file db.accdb

    Alka, ti ringrazio per la spiegazione, vorrei creare un file da 0 per evitare che il file modello possa in qualche modo essere cancellato, da antivirus o altro. Non so se possa essere possibile che venga cancellato, mettendolo nelle risorse del programma. Non sapendo mi sono posto il problema di crearlo. Ovviamente una volta creato e nominato con il codice del conto associato, rimane sul disco e lo apro ogni volta che mi collego al conto. Creo il file nuovo solo quando apro per la prima volta il mio applicativo loggato ad un nuovo conto.

    La soluzione che mi ha indicato Oregon con il link funziona perfettamente. Sono contento che tramite questo forum riesco sempre a trovare una soluzione. Allego parte del codice

    Imports Microsoft.Office.Interop.Access.Dao
    
            Dim AccessDatabaseEngine As New Microsoft.Office.Interop.Access.Dao.DBEngine
            Dim AccessDatabase As Microsoft.Office.Interop.Access.Dao.Database
            Dim StrComando = ""
           Try
    
    
            If My.Computer.FileSystem.FileExists("c:\pippo.accdb") = False Then ''''se non c'è lo creo
                AccessDatabase = AccessDatabaseEngine.CreateDatabase("c:\pippo.accdb", LanguageConstants.dbLangGeneral, DatabaseTypeEnum.dbVersion120)
                AccessDatabase.Close()
                AccessDatabase = Nothing
                AccessDatabaseEngine = Nothing
    
            End If
    
            Catch ex As Exception
                MsgBox("Create failed - " & ex.Message)
            End Try
            
             If My.Computer.FileSystem.FileExists("c:\pippo.accdb") Then ''' controllo se è stato creato
    
                Try
                    If ConnessioneFileDBn.State = ConnectionState.Open Then
                        ConnessioneFileDBn.Close()
                        ConnessioneFileDBn.Dispose()
    
                    End If
                    Me.Refresh()
    
                    ConnessioneFileDBn = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\pippo.accdb")
                    ConnessioneFileDBn.Open()
                    StrComando = "CREATE TABLE PARAMETRI 
                                        (Indice TEXT(25),
                                        Future_Moltiplicatore TEXT(50))"
                    ComandoDB = New OleDb.OleDbCommand(StrComando, ConnessioneFileDBn)
                    ComandoDB.ExecuteNonQuery()
                    ComandoDB.Dispose()
                    ConnessioneFileDBn.closed
                Catch ex As Exception
                    MsgBox(ex.Message)
                    Me.Close()
                End Try
             end if
  • Re: Creare un file db.accdb

    11/01/2023 - fabio1974it ha scritto:


    vorrei creare un file da 0 per evitare che il file modello possa in qualche modo essere cancellato, da antivirus o altro. Non so se possa essere possibile che venga cancellato, mettendolo nelle risorse del programma.

    Non può essere assolutamente cancellato, a meno di non cancellare anche l'eseguibile del programma: il file è una risorsa incorporata all'eseguibile.

    11/01/2023 - fabio1974it ha scritto:


    Creo il file nuovo solo quando apro per la prima volta il mio applicativo loggato ad un nuovo conto.

    Sì, ma hai bisogno di avere Access installato sulla macchina per farlo, e di importare DAO oppure Office.Interop come dipendenza, quando basterebbe un File.WriteAllBytes() usato sulla risorsa, e il gioco è fatto (e sapresti esattamente - con certezza assoluta - qual è la struttura e le proprietà del database che vai a creare, a prescindere dalle opzioni disponibili sulle altre due librerie obsolete).

  • Re: Creare un file db.accdb

    Non può essere assolutamente cancellato, a meno di non cancellare anche l'eseguibile del programma: il file è una risorsa incorporata all'eseguibile.

    Mi interessa questo aspetto, potresti approfondirlo?
    Non capisco come una risorsa incorporata nell'exe possa essere scrivibile.

    Non è una domanda provocatoria, è proprio una domanda :-)

  • Re: Creare un file db.accdb

    Non capisco come una risorsa incorporata nell'exe possa essere scrivibile.

    Scusa, da cosa l'hai dedotta questa cosa?

  • Re: Creare un file db.accdb

    Se tanto è una deduzione sbagliata è inutile sapere da dove viene.
    Prendiamola solo come un'occasione di arricchimento e divulgazione del sapere.

    Posso avere degli esempi, dei link, o dei modi per documentarmi in merito?

    Non sono programmatore nemmeno io ma ogni tanto mi diverto a scrivere qualche riga di codice e questa cosa potrebbe essermi utile avendo sempre fatto affidamento a registro, database, file INI e XML esterni per salvare informazioni

    Ho riletto il messaggio varie volte e forse ho capito dove ho frainteso.
    Si voleva suggerire di mettere il file *.accdb nel Resource Manager?

    Così poi da accedere alla risorsa dal codice dell'EXE, fargliela scrivere sul disco e poi fare tutte le query?

  • Re: Creare un file db.accdb

    11/01/2023 - dylan666 ha scritto:


    Non capisco come una risorsa incorporata nell'exe possa essere scrivibile.

    Infatti ho scritto che NON lo è.

    Generalmente parlando, ovvio, in quanto un file eseguibile è comunque un file, composto da una serie di byte, quindi è possibile apportarvi modifiche come a qualsiasi altro documento.

    Tuttavia, raramente un antivirus al giorno d'oggi ti rimuove una risorsa da un eseguibile perché la rileva come virus lasciandoti il resto del programma intatto: è una situazione più impossibile che unica e rara. :)

  • Re: Creare un file db.accdb

    11/01/2023 - dylan666 ha scritto:


    Se tanto è una deduzione sbagliata è inutile sapere da dove viene.
    Prendiamola solo come un'occasione di arricchimento e divulgazione del sapere.

    Posso avere degli esempi, dei link, o dei modi per documentarmi in merito?

    Non sono programmatore nemmeno io ma ogni tanto mi diverto a scrivere qualche riga di codice e questa cosa potrebbe essermi utile avendo sempre fatto affidamento a registro, database, file INI e XML esterni per salvare informazioni

    No, era per capire cosa ti avesse indotto in errore. A me sembrava chiaro il discorso di Alka, mai detto che si poteva scrivere (in maniera sensata, se non in modo molto molto complesso) sull'eseguibile.

    Se vuoi approfondire cerca informazioni sulla struttura interna di un file Portable Executable.

    Ma in questo thread siamo OT.

  • Re: Creare un file db.accdb

    11/01/2023 - oregon ha scritto:


    11/01/2023 - dylan666 ha scritto:


    Se tanto è una deduzione sbagliata è inutile sapere da dove viene.
    Prendiamola solo come un'occasione di arricchimento e divulgazione del sapere.

    Posso avere degli esempi, dei link, o dei modi per documentarmi in merito?

    Non sono programmatore nemmeno io ma ogni tanto mi diverto a scrivere qualche riga di codice e questa cosa potrebbe essermi utile avendo sempre fatto affidamento a registro, database, file INI e XML esterni per salvare informazioni

    No, era per capire cosa ti avesse indotto in errore. A me sembrava chiaro il discorso di Alka, mai detto che si poteva scrivere.

    Scusa, ho corretto il messaggio mentre scrivevi, quindi al testo che citi ho aggiunto una frase alla fine,

    Riassumendo semplicemente: fabio1974it vorrebbe “distribuire” solo un EXE, senza altri file esterni.
    È una pratica comune? Assolutamente no, è pure priva di senso, lo abbiamo fatto presente tutti.
    Adesso passiamo alla domanda tecnica: se comunque ci si volesse accanire ad avere un solo file EXE con questo si può creare il file db.accdb?

    E qui partono le ipotesi, pure fantasiose (io pure lo faccio per gioco e per sfida):

    1. Possiamo usare Microsoft.Office.Interop.Access.Dao ma sul PC deve esserci Access sul PC che esegue il programma
    2. Possiamo mettere (credo) il file nel Resource Manager
    3. Possiamo prendere un file accdb vuoto convertirlo in base64, metterlo come stringa nel sorgente e poi farglielo riconvertire in formato originario, molto contorto e solo a scopo didattico

    È chiaro che l'antivirus potrebbe cancellare tanto il file db.accdb distribuito insieme all'exe (soluzione consigliata da tutti) che cancellare quello creato da una delle 3 procedura sopra (ammesso che un  db.accdb possa essere considerato malevolo)

Devi accedere o registrarti per scrivere nel forum
32 risposte