Desidero presentare le mie conclusioni come risposta perché il comportamento è sempre coerente.
Ho copiato il codice e inserito un evento click del pulsante, appena cambiato un po 'per essere sicuro di disporre dell'adattatore e della connessione per ogni test effettuato.
// test.xls contains 26664 rows by 5 columns. Average 10 char for column, file size is 2448kb
// OS Windows 7 Ultimate 64 bit. CPU Intel Core2 Quad Q9550 2.83ghz
// 8gb ram and disk C is an 256gb SSD cruzer
private void button1_Click(object sender, EventArgs e)
{
string filename = "c:\\tmp\\test.xls";
Stopwatch sw1 = Stopwatch.StartNew();
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; " +
"Extended Properties=Excel 12.0", filename);
using(var adapter = new OleDbDataAdapter("SELECT * FROM [roots$]", connectionString))
{
var ds = new DataSet();
adapter.Fill(ds, "roots");
sw1.Stop();
Console.WriteLine("Time taken for excel roots: {0} ms", sw1.Elapsed.TotalMilliseconds);
}
}
Quindi, questo è fondamentalmente il tuo codice. Questo codice viene eseguito in 500 ms. MA .... se tengo il file test.xls aperto in Excel 2010, il tempo di esecuzione salta a 8000 ms.
Ho anche provato questa variante di codice, ma i risultati finali sono gli stessi
private void button1_Click(object sender, EventArgs e)
{
string filename = "c:\\tmp\\test.xls";
Stopwatch sw1 = Stopwatch.StartNew();
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; " +
"Extended Properties=Excel 12.0", filename);
using(OleDbConnection cn = new OleDbConnection(connectionString))
{
cn.Open();
using(var adapter = new OleDbDataAdapter("SELECT * FROM [roots$]", cn))
{
var ds = new DataSet();
adapter.Fill(ds, "roots");
sw1.Stop();
Console.WriteLine("Time taken for excel roots: {0} ms", sw1.Elapsed.TotalMilliseconds);
}
}
}
e, no, non è l'Open() del OleDbConnection, è sempre l'adapter.Fill()
set di dati sono oggetti "pesanti", meglio creare la tua classe e riempire un elenco di esso utilizzando datareader – Boomer
Penso che la maggior parte del costo delle prestazioni è il tempo di connessione (prova a modificare le dimensioni del recordset per vedere se il tempo trascorso aumenta drasticamente) – Pynner
Prova per spostare l'inizio dello StopWatch su dopo aver effettuato la connessione e vedere come molto tempo che questa parte richiede. Ma come già sottolineato da Boomer, prova ad utilizzare OleDbCommand e OleDbDataReader invece di OleDbDataAdapter e un DataSet e potresti anche guadagnare un po 'di velocità. –