Oppure

Loading
14/04/12 17:57
piter123
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
aaa
14/04/12 19:53
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 ...
15/04/12 7:43
piter123
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.
aaa
15/04/12 9:22
piter123
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

aaa
15/04/12 9:39
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 15/04/12 9:40
15/04/12 9:50
ampeg
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
aaa
15/04/12 10:49
piter123
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.
aaa
15/04/12 11:12
Postato originariamente da piter123:

adesso senza voler fare troppa polemica...


Ok ... forse non mi sono spiegato bene io ... non importa.