在C#中从MDB读取字典的最快方法

时间:2014-03-18 22:39:53

标签: c#

我想从MDB文件中读取一个相对较大的表,并将其字段保存到Dictionary。这是一次性操作,之后我不需要UPDATEINSERT INTO数据库。所以我只需要SELECT查询。

最快的方法是什么?使用数据集似乎很慢:

var con = new OleDbConnection();
const string dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;";
const string dbSource = "Data Source = D:/programming/Frames.mdb";

con.ConnectionString = dbProvider + dbSource;
con.Open();
const string query = "SELECT * FROM [Concrete Design 1 - Column Summary Data - ACI 318-99]";
var dt = new DataTable();
var da = new OleDbDataAdapter(query, con);
da.Fill(dt);


for (int i = 0; i < dt.Rows.Count; i++)
{
  // Create Dictionary here
}

我知道使用下面的方法会更快,但我只是不知道如何正确使用它:

var con = new OleDbConnection();
const string dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;";
const string dbSource = "Data Source = D:/programming/Frames.mdb";
con.ConnectionString = dbProvider + dbSource;
var cmd = new OleDbCommand { Connection = con };
con.Open();
cmd.CommandText = "SELECT * FROM [Concrete Design 1 - Column Summary Data - ACI 318-99]";


// I don't know how get the fields and rows from the database

con.Close();

2 个答案:

答案 0 :(得分:2)

最有效的方法可能是使用DataReader将数据流式传输到Dictionary。您可以使用DataReader.FieldCount来获取字段数。

以下是使用包含所有字段的自定义类的示例:

var dict = new Dictionary<object, Record>();
using(var reader = cmd.ExecuteReader())
{
    while(reader.Read())
    {
        object key = reader[0];
        Record rec = new Record(key);
        for(int i=0; i< reader.FieldCount; i++)
        {
            rec.Fields.Add(reader[i]);
        }
        dict.Add(key, rec);
    }
}

这是类,如果可能,使用正确的类型和多个属性而不是列表:

public class Record
{
    public Record(object key)
    {
        this.Key = key;
        Fields = new List<object>();
    }
    public object Key;
    public List<object> Fields;
}

答案 1 :(得分:1)

我认为您应该检查读取器读取时带有循环的datareader是否更快将项目添加到您的词典中。