【发布时间】:2016-09-07 11:29:05
【问题描述】:
我有一个文本文件,它的大小约为 3mb(15,000 个字符串),我是从文本文件中插入的。处理需要 30 分钟。如何提高 ms 访问数据库的速度。如果处理时间过长,我想要进度条。
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
FileStream fs = File.OpenRead(ofd.FileName);
BufferedStream bs = new BufferedStream(fs);
StreamReader sr = new StreamReader(bs);
{
metroProgressBar1.Maximum = Convert.ToInt32(sr.Length);
for (int i = 0; i < sr.Length; i++)
{
metroProgressBar1.Value++;
}
string s;
while ((s = sr.ReadLine()) != null)
{
try
{
string pattern = @"[\d]{1,8}([.,][\d]{1,4})?";
Regex r = new Regex(pattern);
Match m = r.Match(s.Substring(77, 41));
while (m.Success)
{
//Console.WriteLine(m);
m = m.NextMatch();
}
string[] row1 = {
s.Substring(46, 31),
s.Substring(77, 41),
s.Substring(118, 8),
s.Substring(127, 10),
s.Substring(138, 10)
};
metroListView1.Items.Add(s.Substring(0, 45)).SubItems.AddRange(row1);
string cmdstr = "INSERT into GGG (event_id, device_id, parameter_id, parameter_int_id, time_id, clock_id, user_id) VALUES ('" + s.Substring(0, 45) + "', '" + s.Substring(46, 31) + "', '" + s.Substring(77, 41) + "', '" + r.Match(s.Substring(77, 41)) + "', '" + s.Substring(118, 19) + "', '" + s.Substring(118, 8) + "', '" + s.Substring(138, 10) + "')";
OleDbConnection con = new OleDbConnection(constr);
OleDbCommand com = new OleDbCommand(cmdstr, con);
try
{
con.Open();
com.ExecuteNonQuery();
con.Close();
}
catch (Exception ex)
{
Console.WriteLine("Error", ex.Message);
}
}
catch (Exception ex)
{
MessageBox.Show("Содержимое файла не соответствует формату таблицы");
}
}
sr.Close();
}
}
}
【问题讨论】:
-
您正在执行 15000 次插入,除非您在 8086 处理器上运行,否则这不会超过几分钟。您可以尝试的第一件事是在每次调用中插入几条记录。试试这个,看看有什么影响。
-
附带说明,您也应该将插入的字符串放入参数中。
-
您可以使用文本驱动程序并在一条 sql 语句中插入全部内容。
-
@Fionnuala 是对的!试试这个:social.msdn.microsoft.com/Forums/en-US/…
标签: c# sql .net ms-access progress-bar