ado+access插入记录的效率问题

bauhaus 2005-01-26 05:38:39
我插入3000条记录,感觉速度太慢了,简直无法忍受
有什么办法能提高插入的效率吗?
谢谢
...全文
168 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jazy 2005-09-08
  • 打赏
  • 举报
回复
我觉得这种约束条件不清晰的表,一次又要插入上千条记录,不如这样处理:每次打开程序都把所有记录读出来放内存里,插入新记录先在内存里检查是否有重复应过滤掉的,内存操作很快啊,等整理好了再删除所有数据,一次批量插入(利用ado的updatebatch很快的)。
flyjzy5 2005-09-07
  • 打赏
  • 举报
回复
没办法定义主健?你把第一个字段置为自动编号不就行了
  • 打赏
  • 举报
回复
bauhaus 2005-01-28
  • 打赏
  • 举报
回复
的确是那里降低了速度
但是我的表没办法定义主健
因为没有一个东西是唯一的
bauhaus 2005-01-27
  • 打赏
  • 举报
回复
我打错了
大概时间时2分左右
表含有5个字段
2个时间字段,其余的是整数
感觉速度还是很慢
部分代码如下:
CString strSql;
CString PyName;
CADORecordset * rs;
CString strTemp;
WORD wUserId;

if(0 == dwRecordCount) //如果没有纪录,不处理,避免不必要的刷新
return TRUE;

rs = theApp.GetRecordPointer();
strSql = "select * from openrecord";

rs->Open(strSql,CADORecordset::openQuery);

if(rs->GetRecordCount())
rs->MoveLast();

bProcessFinished = FALSE;
// _beginthreadex( NULL, 0, ActiveDisplay, NULL, 0, 0 );

for(DWORD i = 0 ; i <dwRecordCount ; ++i)
{
COleDateTime time(2000+BCD2DEC(pOpenRecord[i].year),
BCD2DEC(pOpenRecord[i].month),
BCD2DEC(pOpenRecord[i].day),
BCD2DEC(pOpenRecord[i].hour),
BCD2DEC(pOpenRecord[i].minute),
BCD2DEC(pOpenRecord[i].second));

if(COleDateTime::invalid == time.GetStatus())//如果开门纪录时间无效我没办法处理
continue;
// AfxMessageBox(time.Format("%Y-%m-%d %H:%M:%S"));
strTemp.Format("%s%d","Devicenum=",nDeviceAddress);
strSql = "select * from openrecord where "+strTemp+" and "+" opentime=#"+time.Format("%Y-%m-%d %H:%M:%S")+"#" ;
rs->Open(strSql,CADORecordset::openQuery);
if(rs->GetRecordCount() > 0) //已经存在的???
{
// continue;
}

PyName.Format("%s",pOpenRecord[i].username);
wUserId = ntohs(pOpenRecord[i].userID);
COleDateTime currenttime = COleDateTime::GetCurrentTime();

rs->AddNew();
rs->SetFieldValue("DeviceNum",nDeviceAddress);
rs->SetFieldValue("UserId",wUserId);
rs->SetFieldValue("PyName",PyName);
rs->SetFieldValue("time",time);
rs->SetFieldValue("AddTime",currenttime);

rs->Update();

oyljerry 2005-01-27
  • 打赏
  • 举报
回复
access中不能在程序中直接用存储过程
jayfunk 2005-01-27
  • 打赏
  • 举报
回复
能不能在access中用存储过程?影响速度的是太多I/O操作吧!没法的,只有等啦,因为你这个是写入硬盘
abc789 2005-01-27
  • 打赏
  • 举报
回复
用ADO2.7看看,应该是你的代码有问题。ACCESS数据库不能用存储过程的。

3000条不要怎么多时间的。

把你的代码贴出来看看
gdy119 2005-01-27
  • 打赏
  • 举报
回复
用存储过程,或者调用批处理(批插入)
bauhaus 2005-01-27
  • 打赏
  • 举报
回复
用了10分多钟
内容不是很大
就是一些简单的文本
llm06 2005-01-27
  • 打赏
  • 举报
回复
你能不能说的清楚一点,3000条记录,什么内容,花了多少时间?

估计你自己的代码由问题。
bauhaus 2005-01-27
  • 打赏
  • 举报
回复
谢谢
能够再详细一些吗?
llm06 2005-01-27
  • 打赏
  • 举报
回复
我觉得问题出在这里
strSql = "select * from openrecord where "+strTemp+" and "+" opentime=#"+time.Format("%Y-%m-%d %H:%M:%S")+"#" ;
rs->Open(strSql,CADORecordset::openQuery);
if(rs->GetRecordCount() > 0) //已经存在的???
{
// continue;
}
如果你的表记录很多,这里会很花时间的。
对于数据库,不应该使用这种方法来判断有效性。应该给表设置约束,然后通过try{}catch{}根据错误信息来处理。
stavck 2005-01-27
  • 打赏
  • 举报
回复
定义一个主键,这样插入时不用查询是否存在。
qingz 2005-01-27
  • 打赏
  • 举报
回复
请教一下:CADORecordset 是不是你自己写的一个类。

我也是刚开始看ADO, 看了一下你的代码,你好象是先执行一次 select语句查询一次,如果没有记录才执行插入操作,那你就要执行3000次查询,再加上3000次插入,不知是不是因为这样才慢呢?
oyljerry 2005-01-26
  • 打赏
  • 举报
回复
用存储过程
或分批插入
hxzb7215191 2005-01-26
  • 打赏
  • 举报
回复
怎么会要一下子写入这么多的记录呢?

kingzai 2005-01-26
  • 打赏
  • 举报
回复
1.用ADO中的存储过程.
2.在执行SQL之前,先Prepared = True;

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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