2016-01-12 3 views
0

Я использую класс OleDbDataAdapter для получения данных из файла Access (.mdb).OleDbDataAdapter Fill метод плохой производительности

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Environment.CurrentDirectory+"\\Data.mdb;Jet OLEDB:Database Password=pass"); 
     OleDbCommand com = new OleDbCommand(query, con); 
     DataTable dt = new DataTable(); 
     con.Open(); 
     OleDbDataAdapter oda = new OleDbDataAdapter(com); 
     oda.Fill(dt); 
     oda.Dispose(); 
     com.Parameters.Clear(); 
     con.Close(); 
     return dt; 

Проблема заключается в том, что при отладке я узнал, oda.Fill(dt) занимает очень много времени для выполнения. (около 10 секунд)

У меня есть 50 000 записей в базе данных, и мне нужно только получить 1 строку.

Пожалуйста, помогите. Заранее спасибо.

+1

Каков ваш запрос? У вашей таблицы есть индексирование или что-то еще? –

+0

Если вы используете 'DataReader', вы можете читать только первую строку и не иметь дело с другими записями, которые вам не нужны. – Hambone

+0

это мой запрос: 'Выберите mname, received_date, measure_date, height, weight, calory, pbf_rate, std_weight, fat from member_data где id_number = 1000' –

ответ

2

Если все, что вам нужно, это одна строка попытаться использовать для чтения данных, как показано ниже, из ваших вам нужно будет настроить куски, как имя базы данных, список полей и т.д.

Примечание Пишу вывод в окно IDE Output так открывать его при попытке выполнить это с помощью вашего кода/данных.

public partial class Form1 : Form 
{ 
    private void button1_Click(object sender, EventArgs e) 
    { 
     int id = 0; 
     if (int.TryParse(textBox1.Text, out id)) 
     { 
      OleDbConnectionStringBuilder Builder = new OleDbConnectionStringBuilder(); 
      Builder.Provider = "Microsoft.Jet.OLEDB.4.0"; 
      Builder.DataSource = Path.Combine(Application.StartupPath, "Database1.mdb"); 

      using (OleDbConnection cn = new OleDbConnection(Builder.ConnectionString)) 
      { 
       string selectStatement = "SELECT UserName, JoinMonth FROM Users WHERE Identifier = @Identifier"; 
       using (OleDbCommand cmd = new OleDbCommand { CommandText = selectStatement, Connection = cn }) 
       { 
        cmd.Parameters.Add(new OleDbParameter { ParameterName = "@Identifier", DbType = DbType.Int32, Value = id }); 
        cn.Open(); 
        OleDbDataReader dr = cmd.ExecuteReader(); 
        if (dr.HasRows) 
        { 
         dr.Read(); 
         Console.WriteLine("{0} - {1}", dr.GetString(0), dr.GetString(1)); 
        } 
        else 
        { 
         Console.WriteLine("Not located"); 
        } 
       } 
      } 
     } 
    } 
} 
+0

Спасибо, что это сработало. –

+0

Рад, что это сработало для вас :-) –

Смежные вопросы