Выполняется DataReader
's Read
, который представляет собой метод прямого доступа, только один ряд в ряд, который считывает данные последовательно, чтобы вы получали записи, как только они были прочитаны при подключении, будет лучшее для памяти и производительности.
Это, между двумя подходами, я нахожу IDataAdapter.Fill
намного быстрее, чем DataTable.Load
. Конечно, это зависит от реализации .. Вот тест между двумя, которые я отправил here:
public DataTable Read1<T>(string query) where T : IDbConnection, new()
{
using (var conn = new T())
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = query;
cmd.Connection.ConnectionString = _connectionString;
cmd.Connection.Open();
var table = new DataTable();
table.Load(cmd.ExecuteReader());
return table;
}
}
}
public DataTable Read2<S, T>(string query) where S : IDbConnection, new()
where T : IDbDataAdapter, IDisposable, new()
{
using (var conn = new S())
{
using (var da = new T())
{
using (da.SelectCommand = conn.CreateCommand())
{
da.SelectCommand.CommandText = query;
da.SelectCommand.Connection.ConnectionString = _connectionString;
DataSet ds = new DataSet(); //conn is opened by dataadapter
da.Fill(ds);
return ds.Tables[0];
}
}
}
}
Второй подход всегда превосходит первый.
Stopwatch sw = Stopwatch.StartNew();
DataTable dt = null;
for (int i = 0; i < 100; i++)
{
dt = Read1<MySqlConnection>(query); // ~9800ms
dt = Read2<MySqlConnection, MySqlDataAdapter>(query); // ~2300ms
dt = Read1<SQLiteConnection>(query); // ~4000ms
dt = Read2<SQLiteConnection, SQLiteDataAdapter>(query); // ~2000ms
dt = Read1<SqlCeConnection>(query); // ~5700ms
dt = Read2<SqlCeConnection, SqlCeDataAdapter>(query); // ~5700ms
dt = Read1<SqlConnection>(query); // ~850ms
dt = Read2<SqlConnection, SqlDataAdapter>(query); // ~600ms
dt = Read1<VistaDBConnection>(query); // ~3900ms
dt = Read2<VistaDBConnection, VistaDBDataAdapter>(query); // ~3700ms
}
sw.Stop();
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());
Read1
выглядит лучше на глаза, но адаптер данных выполняет лучше (не путать, что один децибел превосходит другой, запросы были все разные). Однако разница между ними зависела от запроса. Причина может заключаться в том, что Load
требует, чтобы различные ограничения проверялись по строке from the documentation при добавлении строк (его метод на DataTable
), а Fill
- на DataAdapters, которые были предназначены именно для этого - быстрое создание DataTables.
Посмотреть мое сообщение: это меньше кода, чем с использованием DataAdapter. – 2008-12-02 16:59:20