Access数据添加越来越慢

zszc 2013-12-19 05:17:34

从外部导入3000条邮箱地址到 access数据库里
数据库里已经存在十几万条数据
每添加一个邮箱地址,都会和数据库里的数据作比较,如果已经存在这个邮箱则不添加

症状是前几百条添加正常
后面越加越慢,有时候加一条要1分钟,几乎停滞了

求解



for (int i = 0; i < listBox1.Items.Count; i++)
{
CustomerCategoryTaskList.TaskList model = listBox1.Items[0] as CustomerCategoryTaskList.TaskList;
if (!crmData.isEmailExist(model.Email, common.userName))
{
if (crmComm.addTaskListToDataBase(model, customerClass, customerClassText))
{
j++;
tsslblStatus.Text = "状态:添加" + model.Email;
listBox1.Items.Remove(model);
i--;
tsslEmailTaskListCount.Text = listBox1.Items.Count.ToString();
}
}
else
{
listBox1.Items.Remove(model);
i--;
k++;
tsslblStatus.Text = "状态:已存在" + model.Email ;
tsslEmailTaskListCount.Text = listBox1.Items.Count.ToString();
}
Thread.Sleep(0);
}




public bool isEmailExist(string CustomerEmail, string userName)
{
OleDbParameter[] parameters = {
new OleDbParameter("@CustomerEmail", CustomerEmail),
new OleDbParameter("@userName", userName),

};
return DBhelper.Exists("select email from CustomerData where email=@CustomerEmail and userName=@userName", parameters);
}



public bool addTaskListToDataBase(Nob.Model.CrmSys.CustomerCategoryTaskList.TaskList model, string customerClass, string customerClassName)
{
OleDbParameter[] parameters = {
new OleDbParameter("@Email", model.Email),
new OleDbParameter("@Phone", model.Phone),
.....
};
StringBuilder sql = new StringBuilder();//难道是因为循环插入 这里创建太多StringBuilder实例引起的?
sql.Append("insert into CustomerData (");
sql.Append("email,phone,...");
sql.Append(")values(");
sql.Append("@Email,@Phone,...)");
return DBhelper.ExecuteNonqueryBool(sql.ToString(), parameters);


}
...全文
430 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2013-12-25
  • 打赏
  • 举报
回复
上面的是没有重复的, 重复的改成 in 就可以了
吉普赛的歌 2013-12-25
  • 打赏
  • 举报
回复
引用 8 楼 mpy2003 的回复:
[quote=引用 7 楼 yenange 的回复:] [quote=引用 楼主 u011497010 的回复:]
其实你可以换一下思路——3000条数据, 每个都要逐条与数据库里的比较一次, 机器累不累? 可以一次性地把3000条数据的email地址与数据库中的记录对比, 返回已存在的email地址列表。 然后把其它没有的数据一次性插入到数据库, 已存在的则给个提示就可以了[/quote]我想知道怎么样一次性地把3000条数据的email地址与数据库中的记录对比[/quote] 呵呵 你好象不是楼主吧? 1. 将email聚合成类似 "a@163.com,b@sohu.com" 的形式作为参数; 2. 将email聚合字符串用类似 http://blog.csdn.net/yenange/article/details/7175078 的方式转换成表变量; 3. 将已有表与表变量联合查询就可以了。 SQL Server: select email from emailTable where email not in ( select id from [dbo].[fn_Split]('a@163.com,b@sohu.com',',') ) Access自己按这个思路来吧。 其实这个问题不应该放在C#论坛, 数据库论坛更合适!
浩洁 2013-12-25
  • 打赏
  • 举报
回复
引用 7 楼 yenange 的回复:
[quote=引用 楼主 u011497010 的回复:]
其实你可以换一下思路——3000条数据, 每个都要逐条与数据库里的比较一次, 机器累不累? 可以一次性地把3000条数据的email地址与数据库中的记录对比, 返回已存在的email地址列表。 然后把其它没有的数据一次性插入到数据库, 已存在的则给个提示就可以了[/quote]我想知道怎么样一次性地把3000条数据的email地址与数据库中的记录对比
吉普赛的歌 2013-12-25
  • 打赏
  • 举报
回复
引用 楼主 u011497010 的回复:
其实你可以换一下思路——3000条数据, 每个都要逐条与数据库里的比较一次, 机器累不累? 可以一次性地把3000条数据的email地址与数据库中的记录对比, 返回已存在的email地址列表。 然后把其它没有的数据一次性插入到数据库, 已存在的则给个提示就可以了
吉普赛的歌 2013-12-25
  • 打赏
  • 举报
回复
引用 11 楼 mpy2003 的回复:
引用 10 楼 yenange 的回复:
上面的是没有重复的, 重复的改成 in 就可以了
我不是楼主,不过只是觉得可能会碰到这样的问题,不过你举的那个外连接我没有看懂。没有系统地学过差距巨大
其实很简单, 只是用了 SQL Server 里的xml的处理方式。 不用XML, 也可以做到, 只是麻烦一点。 只要有思路, 用什么方式都可以, 关键的是——目的是什么。
浩洁 2013-12-25
  • 打赏
  • 举报
回复
引用 10 楼 yenange 的回复:
上面的是没有重复的, 重复的改成 in 就可以了
我不是楼主,不过只是觉得可能会碰到这样的问题,不过你举的那个外连接我没有看懂。没有系统地学过差距巨大
  • 打赏
  • 举报
回复
对于几十万条记录而言,Jet(Access)数据引擎的速度不会比SQL Server慢。 当然其可靠性很差、多用户操作时容易损坏.mdb文件,修复后则会丢失一堆记录。不过这都不影响单机处理效率问题。 你遇到了“很慢”的情况,应该从设计上找原因。至少有两条:1,你的查询字段是否设计了可用到的索引?2,是否可以想办法调整业务流程,避免判断重复?
jiaoshiyao 2013-12-24
  • 打赏
  • 举报
回复
Access数据库是小型的企业管理吧 比如有100个员工 弄个Access 曾经看过Access企业级的操作教程 感觉糟透了。。。。。。。。。 弄个SqlServer吧 超猛
erictang2003 2013-12-24
  • 打赏
  • 举报
回复
另外,自己做一个定时清理备份,access数据库里面只保留部分实时需要的数据,过期的数据即使转为json或xml备份后删除,access一样能用得很好。 其实access的致命问题是不支持并发。
erictang2003 2013-12-24
  • 打赏
  • 举报
回复
access的数据不光和数据表记录行数有关,和表的字段数量也有关。你把表的字段数减少,十几万应该可以的。不要用太多字段索引。
卧_槽 2013-12-24
  • 打赏
  • 举报
回复
引用 1 楼 u011497010 的回复:
有高手指点迷津吗?我实在想不出来问题在哪里。 不知道是不是Access数据库本身承受不了十几万数据的问题。
是的,要么分表,要么换数据库。
zszc 2013-12-24
  • 打赏
  • 举报
回复
有高手指点迷津吗?我实在想不出来问题在哪里。 不知道是不是Access数据库本身承受不了十几万数据的问题。

111,080

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧