n° 219
Novembre 2017
Dicembre 13, 2017, 05:30:31 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1] 2   Vai giù
  Stampa  
Autore Discussione: Creazione Database Acces da Codice  (Letto 4494 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 70


Mostra profilo
« inserita:: Settembre 29, 2016, 09:49:31 »

Salve,
Ho realizzato un mio applicativo che utilizzando Visual Basic 2010 che utilizza SQL Server Express come DataBase.

Una delle funzionalità che sto implementando e' il BackUp del Database in formato Access.
Sono riuscito a creare le tabelle e popolarle con i dati delle tabelle SQL Server Express.

Il mio dubbio ora e' il fatto che sul DataBase Sql Server Express in ciascuna Tabella Esiste un campo "DataCreazione" con valore predefinito "getDate()" come posso ricreare la stessa funzionalita nel corrispettivo campo su Access?

Nel DataBase Sql Server Express per ciascuna tabella esiste un Trigger che all'update di un record modifica il campo "DataModifica" con la data ora attuale...
E' possibile creare da codice una funzionalita' equivalente su DataBase Access?
Registrato
alex.75
invioattach
Full Member
***

Karma: +14/-4
Scollegato Scollegato

Messaggi: 357



Mostra profilo WWW
« Risposta #1 inserita:: Settembre 29, 2016, 10:59:41 »

Ciao,

posso chiederti quale peccato hai commesso per meritarti questa condanna:
"effettuare backup database SQL Server su Access".

A parte gli scherzi, dato che l'applicativo é tuo perché questa scelta "innaturale" invece che un normale backup di SQL server su file .bak ?
Purtroppo con la versione Express non puoi usare il Maintenance Plan e pianificare backup automatici all'interno di SQL Server stesso, ma dato che manualmente é possibile non credo sia molto difficile trovare i comandi per eseguire l'operazione.
Registrato
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 70


Mostra profilo
« Risposta #2 inserita:: Settembre 30, 2016, 11:05:55 »

Salve,

In effetti sono un po' masochista...
Nella mia mente bacata era in progetto di far funzionare l'applicativo con entrambi i Database....

Nel mio progetto malato utilizzerei Sql Server sul Pc Principale dal quale estrapolerei file DataBase Access da utilizzare su Pc Repliche indipendenti e senza dover installare il motore di Sql Server su ciascun pc...

Dalla mia analisi ho diviso il lavoro in step:
'//####################################
'//#Creazione BackUp Database su Access
'//####################################
'//#Step 1 : Creazione File Database
'//#
'//#Step 2 : Creazione Tabella
'//#
'//#Step 3 : Creazione Campi
'//#
'//#Step 4 : Popolamento Tabella
'//#
'//#Step 5 : Impostare Campo IDX come Identity                                 Tipo Contatore con Autoincremento
'//#
'//#Step 6 : Impostare Campo DataCreazione con Valore Predefinito ("getDate()")
'//#
'//#Step 7 : Creazione Trigger per modifica Campo DataModifica
'//#
'//#Fine


Fino allo Step 4 ci sto arrivando (con qualche problema ma risolvibile)

Dallo step 5 in poi mi sono arenato...
Registrato
alex.75
invioattach
Full Member
***

Karma: +14/-4
Scollegato Scollegato

Messaggi: 357



Mostra profilo WWW
« Risposta #3 inserita:: Settembre 30, 2016, 04:55:08 »

1. Se non hai intenzione di ripopolare il database SQL Server dal backup Access, non é un backup ma una Esportazione.

2. Trigger per aggiornamento su modifica record. Penso che la soluzione sia un After Update Macro Event. Vedi qui: https://msdn.microsoft.com/en-us/library/office/ff193905.aspx

3. Perché ricrei il database e tutti i campi in Access? L'applicazione che li usa si aspetta una struttura "nota", non variabile (spero). Perché non usi un database giá creato ma semplicemente vuoto e lo popoli con i dati estratti da SQL Server?
Dando per scontato che il campo Id sia giá in partenza un Identity autoincrementale anche il punto 5 non esiste.
Stessa cosa per il punto 6 (e 7).
In pratica dovresti eseguire solo l'azione 4.


Se vuoi avere lo stesso ID su entrambi i database NON PUOI pensare che sia possibile generarlo da entrambe le sorgenti in maniera indipendente. La sorgente generatrice dovrebbe essere comune ED ESTERNA.
Detto questo la soluzione pratica che vedo é lasciare il mondo come é e inserire l'ID dei dati di SQL Server in un campo denominato ExternalId (che rimarrá vuoto/0 per i record generati solo in Access).

Ciao.
Registrato
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 70


Mostra profilo
« Risposta #4 inserita:: Settembre 30, 2016, 05:13:00 »

Grazie della risposta...

In realta il mio era un progetto "didattico" quindi stavo preparando un Set di Librerie generiche per sviluppi futuri...Quindi tentavo di creare Funzioni di esportazione senza "vincoli" di progetto.

In effetti per la gestione di questo progetto mi basterebbe "pretendere" la presenza del DataBase Access gia' fatto...

Pero' la proprita' "AutoIncrement" del campi IDX andra' temporanemente disabilitata per poter popolare la tabella con i dati provenienti da SQL per poi riattivarla per utilizzare il Database da programma su Pc Replica

Forse sbaglio ma utlizzo l'IDX creato per creare una specie link tra varie tabelle.

Registrato
alex.75
invioattach
Full Member
***

Karma: +14/-4
Scollegato Scollegato

Messaggi: 357



Mostra profilo WWW
« Risposta #5 inserita:: Settembre 30, 2016, 08:57:40 »

Capito.

Di certo in SQL puoi disattivare e riattivare l'autoincrement.
Immagino si possa fare anche in Access.

Peró cosa succede quando inserisci un record nel database Access e poi tenti di popolarlo con i dati esportati da SQL Server ? Gli Id vanno in conflitto.
Pensiamo a un dato momeno in cui i due database sono allineati ed entrambi hanno come Id il valore N.
Un record inserito in Access prenderebbe un Id pari a N+1. A questo punto come fai a inserirci il record N+1 creato sul database SQL ?

Il tuo é uno scenario realizzabile solo se il database Access non viene mai alimentato da dati diversi da quelli del database SQL. Mi sembra poco realistico (oppure se é cosí non ti interessa avere un autoincrement)

Una possibile soluzione a questo é l'uso di un campo GUID.
Sul database SQL Server lo fai popolare dalla funzione NewId() di SQL Server (ma anche no). Se non esiste la stessa funzione in Access poco male, lo crei da codice con Guid.New() quando crei il nuovo record da inserire.
Puoi lasciare comunque il campo Id autoincrement nelle tue tabelle e ti servirá per le relazioni esterne con altre tabelle.
Questo rende i due DB indipendenti ma ti complica la vita (nemmeno tanto) per la sincronizzazione dei database.

Forse ti ho complicato un poco il lavoro (non so quante tabelle ci sono in gioco), ma ti assicuro che questo é uno scenario "reale" e secondo me é piú utile (ai fini didattici) e ha piú senso piuttosto che impegnarsi in qualcosa che mi pare poco realistico (creare un db Access da codice).
Per la mia esperienza i database Access non esistono nel mondo reale (Excel é invece ovunque) e comunque il problema di avere il conflitto di ID si pone magari anche all'interno dello stesso database se ad esempio due tabelle sono gestite da team/servizi differenti e viene richiesto di "unirle".

Comunque tu voglia procedere spero di averti almeno dato spunti interessanti.

Ciao.

Registrato
DEV-01
Full Member
***

Karma: +11/-23
Scollegato Scollegato

Messaggi: 472

Me.Shift ^(n)


Mostra profilo E-mail
« Risposta #6 inserita:: Ottobre 01, 2016, 04:00:37 »

Esistono dei tool anche gratuiti perfettamente funzionanti che eseguono già questo tipo di operazioni fra i database più comuni.

A volte vengono forniti con sorgenti a corredo.


Registrato

01000100 01100101 01110110 00101101 00110000 00110001
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 70


Mostra profilo
« Risposta #7 inserita:: Ottobre 03, 2016, 08:50:18 »

Salve
Proprio per evitare conflitti di IDX che volevo effettuare un'esportazione da zero dove creavo anche il DB da codice... poi manualmente veniva trasferito sul Pc replica per essere utilizzato solo in visualizzazione (Possibilità di modifiche bloccate da programma o DB a Perdere).

Quello che mi manca sono le istruzioni per il cambio delle prorietà dei campi appena creati e delle macro per replicare i trigger presenti su SQL Server.
Registrato
alex.75
invioattach
Full Member
***

Karma: +14/-4
Scollegato Scollegato

Messaggi: 357



Mostra profilo WWW
« Risposta #8 inserita:: Ottobre 03, 2016, 10:19:28 »

Purtroppo non so come aiutarti a maneggiare Access da codice.
Magari indica quali librerie stai usando, se qualcun'altro si vuole cimentare sa cosa deve usare.

E magari @DEV-01 gentilmente ti suggerisce uno dei tool gratuiti e con sorgenti che permettono di fare questa operazione, cosí potresti trovare la soluzione giá pronta o avere almeno una base.

Citazione
Il tuo é uno scenario realizzabile solo se il database Access non viene mai alimentato da dati diversi da quelli del database SQL. Mi sembra poco realistico (oppure se é cosí non ti interessa avere un autoincrement)
Citazione
veniva trasferito sul Pc replica per essere utilizzato solo in visualizzazione (Possibilità di modifiche bloccate da programma o DB a Perdere).
Non capisco perhé vuoi un campo autoincrementale e un trigger/macro che aggiorna qualcosa se comunque il dato é in sola lettura.

Toglimi una curiositá, IDX da dove viene?
(ID = Identitiy Definition, Id = Identifier)

ciao
Registrato
DEV-01
Full Member
***

Karma: +11/-23
Scollegato Scollegato

Messaggi: 472

Me.Shift ^(n)


Mostra profilo E-mail
« Risposta #9 inserita:: Ottobre 04, 2016, 02:25:12 »

Prova a fare una ricerca su codeproject, github et similia.  Occhiolino
Registrato

01000100 01100101 01110110 00101101 00110000 00110001
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 70


Mostra profilo
« Risposta #10 inserita:: Ottobre 04, 2016, 02:53:30 »

Il campo IDX come lo chiamo io e' un campo Identity di SQL Server che dovro convertire in campo counter per Access...

Vorrei replicare esattamente il comportamento del campo "autoincrement" per poter utilizzare lo stesso programma sul pc replica con semplicemente copiandovi il nuovo db aggiornato...


Per la sincronizzazione tra db me ne occupero' nella versione 2.0 se mai finiro' la 1.0

Sto utilizzando  ADOX per la connessione
Registrato
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 70


Mostra profilo
« Risposta #11 inserita:: Ottobre 24, 2016, 10:10:03 »

Salve,
Non so se e' corretto continuare su questo Post o Crearne uno nuovo... nel caso i moderatori mi avviseranno

Visto la difficolta' di emulare su Access le funzionalità Trigger di SQL Server ho modificato il progetto...

Utilizzerò Sql Server sia sul PC Principale che sui PC Replica.

Per sfruttare tutte le funzioni finora create vorrei comunque mantenere la possibilita di creare un DataBase Acces da zero per eseguire il backUp ma questa volta da utilizzare come file di scambio per eseguire una sincronizzazione tra i DB.

Ora mi si pone il problema che utilizzando un campo IDENTITY come chiave per l'identificazione dei nuovi record se viene inserito un nuovo record sia sul principale che sulla replica al momento della sincronizzazione mi ritrovero' con uno steso campo IDENTITY che fa riferimento però a due record distinti...

E' possibile indicare a Sql Server di utilizzare un determinato range alla generazione del nuovo valore del campo IDENTITY in base al fatto che venga eseguito sul pc principale o sul pc replica?
Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #12 inserita:: Ottobre 24, 2016, 10:31:31 »

SQL Server gestisce le repliche in modo nativo. Non "inventarti" strani modi applicativi.
Registrato
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 70


Mostra profilo
« Risposta #13 inserita:: Ottobre 24, 2016, 02:18:23 »

Sto cercando la documentazione relativa alla gestione delle Repliche per capire se fa ala caso mio ma ho un po' le idee confuse...

Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #14 inserita:: Ottobre 24, 2016, 03:51:50 »

https://msdn.microsoft.com/en-us/library/ms151198.aspx
Registrato
Pagine: [1] 2   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines