WM6.0中,EDB数据库比对记录的问题,高手进来帮下忙啊,很急!

baiyang8361   2008-6-6 09:44 楼主
我现在要在EDB数据库里比对两条记录,没有想到好的方法,有没有知道的高手,知道的说一下啊.


我现在想到的方法就是用CeSeekDatabase来做,但是用这个来找查的时候总是报参数据有错,大概是这样写的:
CEPROPVAL props;

props.propid = PID_NAME;
props.wLenData = 0;
props.wFlags = 0;
wcscpy(props.val.lpwstr,LPCTSTR(m_name));

oid = CeSeekDatabase(m_hDB,CEDB_SEEK_VALUEFIRSTEQUAL,(DWORD)&props,&index);
这里时老是通不过,返回的错误是87(参数有错);但如果改成CEDB_SEEK_BEGINING的话就不会有错.如果是CeSeekDatabaseEx的话,就说句柄有问题.
看了一些贴子,好像大家都是这样的错误,但没有解决.

还有,这个只是查找第一个相等的,如果我要查找所有的,是不是把第二个参数据改成这样:CEDB_SEEK_VALUEFIRSTEQUAL | CEDB_SEEK_VALUENEXTEQUAL .好象又不象,那应该怎么写.

急啊!请帮帮我

回复评论 (14)

补充一下

是VS2005+PPC6.0
点赞  2008-6-6 09:58
  1. HRESULT hr = S_OK;
  2.     HANDLE hdb;
  3.     CEPROPVAL val;
  4.     CEOID oid;
  5.    
  6.     if(FAILED(hr = GetDatabase(&hdb, NULL)))
  7.         {
  8.         goto Error;
  9.         }

  10.     val.propid = CPR_TLA;
  11.     val.wFlags = 0;
  12.     val.val.lpwstr = const_cast(pszTLA);
  13.     oid = CeSeekDatabase(hdb, CEDB_SEEK_VALUEFIRSTEQUAL, (DWORD)&val,
  14.             NULL /* yes, this param can be null and should be if you don't need it */);
  15.     if(NULL == oid)


wm6上的sample
C:\Program Files\Windows Mobile 6 SDK\Samples\Smartphone\cpp\Win32\Currency\PPCCur\ExMan.cpp
点赞  2008-6-6 10:00
我看了一下,SDK中没有Smartphone的例子代码,你能不能发给我一份?
279578853@qq.com

谢谢.
点赞  2008-6-6 11:35
已发
点赞  2008-6-6 13:08
那还有VALUENEXTEQUAL呢?
这个类型的是怎么用的?我一用这个就报一个系统文件的第多少行出错.

在Seek的时候是不是不能Seek多个字段,如:
props[0].propid = PID_NAME;
props[0].wLenData = 0;
props[0].wFlags = 0;
wcscpy(props[0].val.lpwstr,LPCTSTR(m_name));

props[1].propid = PID_NO;
props[1].wLenData = 0;
props[1].wFlags = 0;
wcscpy(props[1].val.lpwstr,LPCTSTR(m_no));  
在打开的时候没有用这两个排序,但是CEDB数据,在创建的时候用了这两个排序.
一用这个的时候就返回SEEK_ERROR.
点赞  2008-6-12 11:23

7楼 wcg 

我发的例子中有VALUENEXTEQUAL的使用方法。

但只是seek单个字段的。

你先试试单个的,成功后再试多个的。慢慢找了。
点赞  2008-6-12 12:56
那个例子里没有用VALUENEXTEQUAL的,不过这个我已经搞定了,是因为index变量我重用了,但在第一次Seek的时候已经写了值进去了.

现的问题是CeSeekDatabase真的可以用来查多个字段吗?
如果不能的话,那帮助文档说的那个数组是什么,难道是这个字段的不同值?如我值PID_NO等1和2的所有记录.
但我这样也试了,效果还是和查一个字段一样,等把dwNumValue设成2时就报错,只能设成1.

请问lenux,你有做这个吗?
点赞  2008-6-12 18:51
没有用过seek,
点赞  2008-6-13 09:42
唉!郁闷啊.
好象照帮助文档里说的来看的话,貌似不行.发现这个数据库功能真的不怎么样啊.

了解这个数据库的人也非常少,这下子真的郁闷了.
想找个做个这个数据库备份与还原的人交流交流.
点赞  2008-6-13 14:00
这个是小型数据库,保存少量数据的。

我是直接从头到尾检查一遍来处理seek功能的。

现在也很少用这个东西了。
点赞  2008-6-13 14:17
嗯,我知道,我以前也是用的这个方法。
现在没招了,只能回到用这种方法。

  能不能在请教你一个问题。这个数据库里面不有有些特别的字段吗(BLOB),我想比对这些字段,但还不知道怎么读出来。SDK里有个例子把联系人的图片读出来了,但是好象不能用来比对两个BLOB。MSDN上介绍说好象要用流的方法来处理,不过说的不怎么多,你对这个了解吗?能不能介绍一下,或给个例子让我研究。


谢谢!
点赞  2008-6-14 09:14
BLOB的可是字节流,BYTE*的,要比较估计需要一个比较好算法才行的。不然容易出错,且很慢。
点赞  2008-6-16 09:57
要查找一个的话,
还要在CEDBASEINFOEX定义下SORTORDERSPECEX这个变量,
比如你要查找PID_NAME这个字段,
  1. SORTORDERSPECEX sortInfo;
  2.         memset(&sortInfo,0,sizeof(sortInfo));
  3.         sortInfo.wVersion = 1;
  4.         sortInfo.wNumProps=1;
  5.         sortInfo.wKeyFlags = 1;   //SET IT FOR KEY
  6.         sortInfo.rgPropID[0] =PID_NAME;
  7.         sortInfo.rgdwFlags[0] = CEDB_SORT_DESCENDING;   //DEFAULT SET       
  8.         DBInfo.rgSortSpecs[0] = sortInfo;
  9. //然后定义你要查找的字段:
  10.         CEPROPVAL ceSearchProp ;
  11.                 ceSearchProp.propid = PID_NAME;               
  12.                 ceSearchProp.wFlags = 0;
  13.                 ceSearchProp.wLenData = 0;
  14.                 ceSearchProp.val.lpwstr = _T("name1");
  15. Oid = CeSeekDatabase(hMyOpenDB, CEDB_SEEK_BEGINNING, 0, NULL/*&dwTempIndex*/);
  16. Oid = CeSeekDatabase(hMyOpenDB, CEDB_SEEK_VALUEFIRSTEQUAL, (DWORD)&ceSearchProp, NULL/*&dwTempIndex*/);               

如果找到的话,Oid返回的是在数据库中某行的值。
如果找不到返回oid为0,错误吗为ERROR_SEEK。

如果你要查找别的字段,比如PID_ID,则getlasterror就会返回ERROR_INVALID_PARAMETER的错误码了。
所以是否能查找是要看你在定义CEDBASEINFOEX里面排序字段的首字段(记得是首字段的排序,其后的排序字段也是会报ERROR_INVALID_PARAMETER的错误码)。

要查找多个字段,每行读出来一个个比了。
呵呵..
点赞  2008-6-23 18:53
先不说BLOB怎么比对,问题是我还不知道怎么读出来呢。
用CeOpenStream的话,就在这里过不去了,
可能是压缩过了,所以不能用这种方法吗?
有谁读过啊!!!
点赞  2008-6-26 15:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复