Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [vbnet] salvare record in access
Forum - C# / VB.NET - [vbnet] salvare record in access - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
piter123 (Normal User)
Pro


Messaggi: 145
Iscritto: 21/05/2008

Segnala al moderatore
Postato alle 18:03
Mercoledì, 21/11/2012
perfetto. solo che invece di aggiungerli sotto i 5000 ho bisogno di aggiungerli
sopra.

Nuovo record ho bisogno che diventi id 1 e gli altri vecchi che aumentino di 1 il loro id.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:57
Mercoledì, 21/11/2012
Testo quotato

Postato originariamente da piter123:

perfetto. solo che invece di aggiungerli sotto i 5000 ho bisogno di aggiungerli
sopra.



Non esiste un "sotto" o un "sopra" in un DB.

Testo quotato

Nuovo record ho bisogno che diventi id 1 e gli altri vecchi che aumentino di 1 il loro id.



Mi sembra una gestione assurda dei dati e sicuramente, conoscendo tutta la problematica, ci sarà un'altra soluzione "sensata" ... In genere un campo Id è un "identificatore" del record intero e come tale NON dovrebbe essere modificato.

In ogni caso, dovresti operare con due frasi SQL

1) per aggiornare gli ID

UPDATE Tabella SET Id = Id+1;

2) per inserire il nuovo record con Id a 1

INSERT INTO Tabella ...

è inutile che scrivo il resto

Ultima modifica effettuata da nessuno il 21/11/2012 alle 18:59


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
piter123 (Normal User)
Pro


Messaggi: 145
Iscritto: 21/05/2008

Segnala al moderatore
Postato alle 19:37
Mercoledì, 21/11/2012
già fatto.
se devo aggiungere esempio 3 record :
1) elimino gli ultimi 3 record    " delete .....
2) rinomino gli id con id+3      " update....
3) inserisco i nuovi record con relativi campi  " insert into

risultato : la procedura è più lenta che non riscrivere tutti i 5000 record.

per quando riguarda il sotto o il sopra, l'id mi serve per identificare la sequenza.
I campi del record id=1 sono più recenti dei campi del record id=2 e così via verso id=5000 , in questo modo non devo fare nessun tipo di ordinamento e la loro eventuale verifica visiva utilizzando access risulta immediata.

Cercavo una soluzione del tipo copia incolla in blocco i campi per esempio da id 1 a id 5000 nella posizione
iniziale id=4 perdendo gli ultimi 3 record (cosa fattibile in manuale all'interno di access), lasciando così liberi di essere riscritti solo i primi 3 record nell'esempio specifico e mantenere così la sequenza id=1 più recente di id=2 e così via.

Potrei ribaltare gli id della serie il più alto è il più recente, quindi basterebbe aggiungere i nuovi record e basta, ma mi troverei nel giro di qualche giorno una tabella di 20000-30000 record, dopo un mese non sarebbe più gestibile.



Ultima modifica effettuata da piter123 il 21/11/2012 alle 19:43
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:41
Mercoledì, 21/11/2012
Testo quotato

Postato originariamente da piter123:
risultato : la procedura è più lenta che non riscrivere tutti i 5000 record.



Ma no ... bisogna vedere cosa fai.

Testo quotato

per quando riguarda il sotto o il sopra, l'id mi serve per identificare la sequenza.
I campi del record id=1 sono più recenti dei campi del record id=2 e così via verso id=5000



Allora non inserire questo Id ma un timestamp. Quando fai la INSERT scrivi in un campo data e ora.
In questo modo avrai sempre e automaticamente i record con l'indicazione della loro "età" ...



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
piter123 (Normal User)
Pro


Messaggi: 145
Iscritto: 21/05/2008

Segnala al moderatore
Postato alle 19:46
Mercoledì, 21/11/2012
5 minuti e posto i codici

PM Quote
Avatar
piter123 (Normal User)
Pro


Messaggi: 145
Iscritto: 21/05/2008

Segnala al moderatore
Postato alle 19:51
Mercoledì, 21/11/2012
copia tutto la matrice (5000 dati)
'COPIA TUTTO LO STORICO SU TABELLA ACCESS
            For I = 1 To 5000
                cmd.CommandText = "UPDATE " & NomeTab & " SET " _
                & "C1 = '" & Sto(1, 1, I, 1) & "', " _
                & "C2 = '" & Sto(1, 1, I, 2) & "', " _
                & "C3 = '" & Sto(1, 1, I, 3) & "', " _
                & "C4 = '" & Sto(1, 1, I, 4) & "' " _
                & "WHERE ID = " & I
                cmd.ExecuteNonQuery()
            Next
***********************************************************************

elimino ultimi 3 record della tabella, rinomino id con id=id+3, inserisco 3 nuovi record e relativi campi con id da 1 a 3


qtadati=3
'CANCELLA ULTIME RIGHE IN BASE ALLA QTà DI RIGHE DATI DA INSERIRE
            For I = 5000 To qtadati+1 Step -1
                cmd.CommandText = "DELETE * FROM " & NomeTab & " WHERE ID = " & I
                cmd.ExecuteNonQuery()
            Next
            'RINOMINA ID RIGHE PARTENDO DAL BASSO VERSO L'ALTO
            For I = 5000- qtadati To 1 Step -1
                IdNuovaRiga = I + qtadati
                cmd.CommandText = "UPDATE " & NomeTab & " SET ID = " & IdNuovaRiga & " WHERE ID = " & I
                cmd.ExecuteNonQuery()
            Next
            'INSERISCE RIGHE AGGIORNAMENTO
            For I = 1 To qtadati
                cmd.CommandText = "INSERT INTO " & NomeTab & " (ID, C1, C2, C3, C4) VALUES " _
                    & "(" & I & ", '" & Sto(K, X, I, 1) & "', '" & Sto(K, X, I, 2) & "', '" _
                    & Sto(K, X, I, 3) & "', '" & Sto(K, X, I, 4) & "') "
                cmd.ExecuteNonQuery()
            Next


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:03
Mercoledì, 21/11/2012
Ma certo che è più lento !

A parte che fai le DELETE in un ciclo quando ne basta una sola (elimina quel for !), che senso ha fare l'UPDATE di righe che sono state cancellate ??

Ti faccio notare che, ad esempio fai la DELETE della riga con Id 4900 e poi l'UPDATE della riga con Id 4900 !


Ultima modifica effettuata da nessuno il 21/11/2012 alle 20:11


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 20:18
Mercoledì, 21/11/2012
non ho capito la logica, comunque per velocizzare puoi scrivere i dati su un file di testo anziché direttamente nel db, l'operazione dovrebbe essere decisamente più veloce... e poi importare il file di testo nel DB

il file di testo avrà il seguente formato: i campi separati dalla virgola, le righe separate dal vbNewLine

una cosa di questo tipo (va incluso anche il nome dei campi come prima riga):

ID,C1,C2,C3,C4
1,20,30,15,12
2,45,25,50,35
3,51,21,60,50

dopo di che con il seguente codice importi il file

Codice sorgente - presumibilmente VB.NET

  1. Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\database.mdb")
  2.     Dim cmd As New OleDbCommand("INSERT INTO tab1 SELECT * FROM [Text;FMT=Delimited;HDR=Yes;CharacterSet=850;DATABASE=D:\].nomefile.txt;", cn)
  3.  
  4.     cn.Open()
  5.     cmd.ExecuteNonQuery()
  6.     cn.Close()



nell connection string dove c'è Data Source = .. metti il percorso + nome del tuo db
nella query al posto di D:\].nomefile.txt" metti il percorso e il nome del file da importare nel db

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo