我想从MDB
文件中读取一个相对较大的表,并将其字段保存到Dictionary
。这是一次性操作,之后我不需要UPDATE
或INSERT 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();
答案 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是否更快将项目添加到您的词典中。