求助EDB获取数据库的条数???

sc_valentine21 2008-11-22 05:45:51
我新建了一个EDB数据库,要获取一共有多少条信息,怎么获得到啊?
我以前是

int CDBManager::GetRecordCount( enum DBMODE dbtype )
{
int count = 0;
CEOID oidRecord = 1;
WORD wNumProps = 0;
CEPROPVAL *pRecord = NULL;
DWORD dwBufSize = 0;

while ( oidRecord )
{
CeSeekDatabaseEx( m_hDB, CEDB_SEEK_BEGINNING, count, 0, 0 );
oidRecord = CeReadRecordPropsEx( m_hDB, CEDB_ALLOWREALLOC, &wNumProps, NULL, ( LPBYTE * )&pRecord, &dwBufSize, NULL );
if ( !oidRecord )
{
break;
}
count++;
}
return count;
}

这样获取的,效率实在是很低下,所以请求各位,怎么高效一点啊?
...全文
318 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
doublestarts 2008-11-28
  • 打赏
  • 举报
回复
没错,不应该一条一条的读取,在数据库信息结构里面可以读取出来的,刚开始我也没有读成功,现在确实可以了哦!
doublestarts 2008-11-28
  • 打赏
  • 举报
回复
没错,不应该一条一条的读取,在数据库信息结构里面可以读取出来的,刚开始我也没有读成功,现在确实可以了哦!
sc_valentine21 2008-11-28
  • 打赏
  • 举报
回复
还想问下,要是删除数据库中的所有数据呢?
CeDeleteRecord
好像是删除一条记录吧!
sc_valentine21 2008-11-28
  • 打赏
  • 举报
回复
感谢各位了,刚好昨天晚上研究出来了,你们今天就给出答案来了,要是早点多好啊,呵呵,不过还是谢谢
shiyang_x 2008-11-28
  • 打赏
  • 举报
回复
19 楼正解
CeOidGetInfoEx 或 CeOidGetInfoEx2

CEOIDINFOEX oidinfoex;
oidinfoex.wVersion = CEOIDINFOEX_VERSION;
CeOidGetInfoEx2(&pCeGuid, DBOid, &oidinfoex);
guguqiaqia 2008-11-27
  • 打赏
  • 举报
回复
找微软的api函数。直接拿来用。
napolun007 2008-11-27
  • 打赏
  • 举报
回复
CEGUID *pCeGuid//存储数据库文件卷标识
CEOID ceOid //存储数据库对象标识
int iCount;
CEOIDINFO oidinfo;
if (!CeOidGetInfoEx(pCeGuid,ceOid,&oidinfo))//获取里面的数据信息
{
AfxMessageBox(_T("获取信息失败"));
return -1;
}
iCount = oidinfo.infDatabase.wNumRecords;
sc_valentine21 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 comiunknown 的回复:]
你检查一下CeWriteRecordProps()执行后的返回结果,看看是否成功写入了。

如果写入成功,但是用你的顶贴的方法能检索到,用CeGetDBInformationByHandle查询还是0的话,看看CeGetDBInformationByHandle之后GetLastError返回什么错误。

有可能是你创建的EDB数据库超过6个字段,你只写了每条记录中的6个字段,由此导致CeGetDBInformationByHandle获取记录条数失败。这样的话你只能自己写一个api来获取数据库记录条数,方法也…
[/Quote]

的确是成功写入的,我的方法也能得到。我只定义了6个字段,我写也是写的6个撒,应该没错
sc_valentine21 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ciahi 的回复:]
http://blog.csdn.net/ciahi/archive/2008/11/23/3357646.aspx
[/Quote]

你发了那个我看了,我参数也都是那么写的啊,不知道怎么就出错了。

我这么写的

BY_HANDLE_DB_INFORMATION bhdi;
memset(&bhdi, 0, sizeof(BY_HANDLE_DB_INFORMATION));
bhdi.wVersion = 2;
bhdi.guidVol = m_VolGUID;
bhdi.oidDbase = m_ceOid;
if (!CeGetDBInformationByHandle(m_hDB, &bhdi))
{
DWORD dd = GetLastError();
return 0;
}
return bhdi.infDatabase.dwNumRecords;

参数我前面做的

m_hDB = CeOpenDatabaseInSession( m_hSession,&m_VolGUID, &m_ceOid, CHATMSGDB, 0, 0, NULL);

很是无语,怎么会不对,按照我原来的做法就是对的呀,按照你说的就0,晕得很。
ciahi 2008-11-24
  • 打赏
  • 举报
回复
http://blog.csdn.net/ciahi/archive/2008/11/23/3357646.aspx
comiunknown 2008-11-24
  • 打赏
  • 举报
回复
你检查一下CeWriteRecordProps()执行后的返回结果,看看是否成功写入了。

如果写入成功,但是用你的顶贴的方法能检索到,用CeGetDBInformationByHandle查询还是0的话,看看CeGetDBInformationByHandle之后GetLastError返回什么错误。

有可能是你创建的EDB数据库超过6个字段,你只写了每条记录中的6个字段,由此导致CeGetDBInformationByHandle获取记录条数失败。这样的话你只能自己写一个api来获取数据库记录条数,方法也不难,你先算出该数据库的每条记录的size,然后用CeSeekDatabaseEx(),第一次CEDB_SEEK_BEGINNING,第二次CEDB_SEEK_END,得出2次检索的地址值,它们之间的差值除以每条记录的size,再+1,就是该数据库的记录条数。
ciahi 2008-11-24
  • 打赏
  • 举报
回复
晕,我给你的那代码是正确的呀

你是不是参数设错了??

包括hDB、g_VolGuid、DBoid等
你都设置的正确吗?
sc_valentine21 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ciahi 的回复:]
晕,你好像问过这个问题呀~
CeGetDBInformationByHandle这个函数可以的
[/Quote]
很郁闷,按照上面做了。可是返回的是零,我明明是向里面加了数据的,如果按照我以前那种能够得到条数,按照你给的就得不到,啥原因,难道写有不对?我是这么写的:

//pStruct是我定义的一个结构,num是条数
for ( int i = 0; i < num; i++ )
{
CEPROPVAL myCepropval1[6];
myCepropval1[0].propid = PID_MID;
myCepropval1[0].wFlags = 0;
myCepropval1[0].wLenData = 0;
myCepropval1[0].val.lVal = pStruct[i].msgId;

myCepropval1[1].propid = PID_MSENDER;
myCepropval1[1].wFlags = 0;
myCepropval1[1].wLenData = 0;
myCepropval1[1].val.lpwstr = pStruct[i].msgSender;

myCepropval1[2].propid = PID_MRECIVER;
myCepropval1[2].wFlags = 0;
myCepropval1[2].wLenData = 0;
myCepropval1[2].val.lpwstr = pStruct[i].msgReciver;

myCepropval1[3].propid = PID_MCONTENT;
myCepropval1[3].wFlags = 0;
myCepropval1[3].wLenData = 0;
myCepropval1[3].val.lpwstr = pStruct[i].msgContent;

myCepropval1[4].propid = PID_MISREAD;
myCepropval1[4].wFlags = 0;
myCepropval1[4].wLenData = 0;
myCepropval1[4].val.boolVal = pStruct[i].msgIsRead;

myCepropval1[5].propid = PID_MRECIVETIME;
myCepropval1[5].wFlags = 0;
myCepropval1[5].wLenData = 0;
myCepropval1[5].val.filetime = pStruct[i].msgFileTime;

CeWriteRecordProps( m_hDB, 0, 6, myCepropval1 );

我想这个应该不会错,就是不晓得问题出在哪,怎么就返回是0呢?
sc_valentine21 2008-11-24
  • 打赏
  • 举报
回复
是不行,我也试过了。
ziamhitler 2008-11-24
  • 打赏
  • 举报
回复
经测试,还是不行!如果有朋友实现了查询记录条数的方法。请将数据库的建立、写、查询代码一起贴出来!
ziamhitler 2008-11-24
  • 打赏
  • 举报
回复
呵呵,我后来没有去获取这个记录的条数了,因为我获取这个数值,只是为了方便分配空间,方便用结构数组。后来我就用链表了,读到一个分配一个,遍历下去也可以获得记录条数。
还是没怎么理解comiunknown的方法,我再去试试。
comman_ndsc 2008-11-24
  • 打赏
  • 举报
回复
comiunknown说的方法可以试一下!
不过我觉得前后两个地址值相减就可以得到长度了。
sc_valentine21 2008-11-24
  • 打赏
  • 举报
回复
ziamhitler
现在你是怎么做的?
ziamhitler 2008-11-24
  • 打赏
  • 举报
回复
哦,对了每条记录的size怎么计算?如果记录里面存储的是一个BLOB也就是一个byte型的空间,这个怎么计算。CeSeekDatabaseEx返回值是oid用这个方法,在中间的记录没有被删除时到是可以获得记录的条数,如果中间有一条记录被删除了,那就有问题了,因为如果中间某条记录被删除了,那个oid的空间会被空出来,SEEK_END的返回值还是一样。两个oid的值相减结果还是跟原来一样,就不正确了。
ziamhitler 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 comiunknown 的回复:]
你检查一下CeWriteRecordProps()执行后的返回结果,看看是否成功写入了。

如果写入成功,但是用你的顶贴的方法能检索到,用CeGetDBInformationByHandle查询还是0的话,看看CeGetDBInformationByHandle之后GetLastError返回什么错误。

有可能是你创建的EDB数据库超过6个字段,你只写了每条记录中的6个字段,由此导致CeGetDBInformationByHandle获取记录条数失败。这样的话你只能自己写一个api来获取数据库记录条数,方法也…
[/Quote]
我最近也在用EDB,以前试过用上面的代码来获取记录的条数,结果跟lz一样得到的都是0.不知道你是否自己测试过?
加载更多回复(4)

7,657

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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