6 messaggi dal 12 ottobre 2010
Ho creato una classe per la gestione database SQLServer, utilizzando un DataTable.
Funziona tutto perfettamente, ma i tempi rispetto ad una query classica raddoppiano e soprattutto non riesco a gestire più di 1.048.576 records, che è il limite massimo del DataTable (RecordCapacity mi ritorna tale valore).

Vorrei sapere se c'è un metodo più efficiente, oppure velocizzare il DataTable, e renderne illimitata la capienza del DataTable.

Scrivo qui il codice:
nella classe:

Public Class SqlServer
Public Function SqlSelect(ByVal SqlQuery As String) As DataTable
Dim connectionString As String = ConfigurationManager.ConnectionStrings("NameConnection").ToString

Dim dt As New DataTable
Dim conn As SqlConnection = Nothing
SqlSelect = Nothing
Try
conn = New SqlConnection(connectionString)
Dim cmd As SqlCommand = New SqlCommand(SqlQuery, conn)
conn.Open()
Dim dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)

dt.Load(dr)
Return dt

Catch ex As SqlException
'Gestione errore
Catch ex As Exception
'Gestione errore
Finally
conn.Close()
End Try
End Function
End Class

========================================================
questo il codice che richiama la funzione della classe:
Dim valoreCampo0 as String
Dim SqlDT New SqlDB.SqlServer
Dim dati As DataTable = SqlDT.SqlSelect("select * from tabella ")
For i = 0 To dati.Rows.Count - 1
valoreCampo0 = dati.Rows(i).Item(0).ToString
Next
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
l'aver raggiunto il limite del DataTable è un code smell che deve indurti a riconsiderare il tuo approccio.

Quando riempi un DataTable, i dati devono passare dal disco fisso alla memoria RAM, perché è lì che l'oggetto risiede. Questa operazione di copia richiede del tempo e, soprattutto, occupa in maniera considerevole la RAM del server con dati che probabilmente non verranno mai usati o mai mostrati all'utente.

Qualsiasi sia il risultato che vuoi ottenere, devi fartelo restituire da una query SQL. Il database saprà come ottimizzare l'accesso ai dati e, soprattutto, non avrà bisogno di caricare l'intero resultset in memoria per esaminarlo.
Dovresti modificare la tua query "select * from tabella" in "SELECT SUM(importo) FROM tabella" se, ad esempio, volessi calcolare l'importo totale di tutti i records.

Spiega bene cosa devi realizzare, così potrai avere consigli più precisi.

ciao

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.