piter123 (Normal User)
Pro
Messaggi: 145
Iscritto: 21/05/2008
|
Salve, con il seguente codice aggiorno una tabella
di un database di sql server express 2005.
La matrice PROVA è : dim PROVA(1 TO 4, 1 TO 5000) as variant
ed è composta da Data, Ora, Dato1 e dato 2.
Il problema è che ci mette 10 secondi per aggiornarla.
Esiste gentilmente un sistema più rapido
Dim I As Integer
Dim cn As New ADODB.Connection
Dim SQL As String
'APRE DATABASE
cn.Open _
"Provider =sqloledb ;" & _
"Data Source=SERVER\SQLEXPRESS;" & _
"Initial Catalog=" & NOMEDATABASE & ";" & _
"User ID=UTENTE;" & _
"Password=PASSWORD;"
'AGGIORNA TABELLA
For I = 1 To 5000
SQL = "UPDATE " & NOMETAB & " SET " _
& "DATA = '" & PROVA(1, I) & "', " _
& "ORA = '" & PROVA(2, I) & "', " _
& "DATO1 = '" & PROVA(3, I) & "', " _
& "DATO2 = '" & PROVA(4, I) & "' " _
& "WHERE id = " & I
cn.Execute (SQL)
Next I
'CHIUDE DATA BASE
cn.Close
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
La mia domanda è ... ma perché mai fai questo strano aggiornamento?
Perché aggiorni 5000 record in una sola volta?
Ovvero, per farti capire, quello che fai non ha senso ...
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à. |
|
piter123 (Normal User)
Pro
Messaggi: 145
Iscritto: 21/05/2008
|
dunque, la matrice di 5000*4 campi viene aggiornata in continuazione.
I campi della matrice non hanno mai lo stesso valore, ne deriva il fatto che il database deve essere sempre aggiornato con i valori della matrice.
nella vita tutto ha un senso che è dettato dalle nostre esigenze personali.
|
|
piter123 (Normal User)
Pro
Messaggi: 145
Iscritto: 21/05/2008
|
ho provato con oggetto adodc ma il risultato addirittura peggiora, magari sbaglio io in qualcosa.
Dim I As Integer , X As Integer
Dim cn As New ADODB.Connection
Dim SQL As String
'APRE DATABASE
cn.Open _
"Provider =sqloledb ;" & _
"Data Source=SERVER\SQLEXPRESS;" & _
"Initial Catalog=" & NOMEDATABASE & ";" & _
"User ID=UTENTE;" & _
"Password=PASSWORD;"
Adodc1.ConnectionString = cn
Adodc1.RecordSource = "SELECT * FROM " & NOMETAB
Adodc1.Recordset.MoveFirst
For I = 0 To 5000 - 1 'RECORD RIGA
For X = 0 To 4 'CAMPI COLONNA
If X <> 0 Then
Adodc1.Recordset(X) = PROVA(X, I + 1)
Else
Adodc1.Recordset(X) = I + 1
End If
Next X
Adodc1.Recordset.Update
Adodc1.Recordset.MoveNext
DoEvents
Next I
'CHIUDE DATA BASE
cn.Close
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
nella vita tutto ha un senso che è dettato dalle nostre esigenze personali. |
Non è così. Molte volte si cercano delle soluzioni a problemi che ci creiamo perché non sappiamo che potrebbero essere affrontati diversamente.
Prova a descrivere meglio il problema dell'aggiornamento della matrice ... perché hai in memoria tutti quei dati ? Perché non aggiorni direttamente sul DB quelli che si aggiornano in un determinato momento invece di scaricarli tutti ? Ti serve proprio un DB o devi solamente salvare su disco il contenuto della matrice ? Ultima modifica effettuata da nessuno il 15/04/2012 alle 11:40
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à. |
|
ampeg (Normal User)
Pro
Messaggi: 124
Iscritto: 21/04/2011
|
hai provato a scrivere i dati su un file ed importarlo con il comando BULK INSERT ?
con Sql Server è possibile importare in blocco i dati da un file, quindi potresti scrivere i dati su un file di testo, eliminare tutti i record con "DELETE FROM TABELLA" e importare il file creato con la BULK INSERT
|
|
piter123 (Normal User)
Pro
Messaggi: 145
Iscritto: 21/05/2008
|
adesso senza voler fare troppa polemica ho bisogno di idee e di codici, non di assurde domande su cosa devo fare e il perchè lo devo fare o se devo proprio usare un db, saranno .... miei.
E quindi a tal proposito ringrazio ampeg. Si potrebbe essere un'idea infatti pensavo a qualcosa per caricare in blocco la matrice ma non sapevo come, proverò con BULK INSERT, ancora grazie.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Postato originariamente da piter123:
adesso senza voler fare troppa polemica... |
Ok ... forse non mi sono spiegato bene io ... non importa.
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à. |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
purtroppo i sistemi informatici sono ottimizzati per fare cose sensate, e purtroppo quella che vuoi fare te non lo è molto
tendenzialmente quando vuoi fare qualcosa di semplice ed il software non ti sta dietro è perchè lo stai facendo sbagliato, questa è una regola di vita del programmatore XD
considera che le update generate in questo modo sono veramente inefficienti, molto meglio sarebbe fare una bulk come ti è stato consigliato, ma cmq non spostiamo il problema sul fatto che "fatto così" non è furbo.
se ci dai maggiori informazioni sullo scenario di utilizzo di questo snippet di codice possiamo aiutarti meglio, nessuno è qui per fare polemica
|
|