WM6.0中,EDB数据库比对记录的问题,高手进来帮下忙啊,很急!
我现在要在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 .好象又不象,那应该怎么写.
急啊!请帮帮我
- HRESULT hr = S_OK;
- HANDLE hdb;
- CEPROPVAL val;
- CEOID oid;
-
- if(FAILED(hr = GetDatabase(&hdb, NULL)))
- {
- goto Error;
- }
- val.propid = CPR_TLA;
- val.wFlags = 0;
- val.val.lpwstr = const_cast(pszTLA);
- oid = CeSeekDatabase(hdb, CEDB_SEEK_VALUEFIRSTEQUAL, (DWORD)&val,
- NULL /* yes, this param can be null and should be if you don't need it */);
- if(NULL == oid)
wm6上的sample
C:\Program Files\Windows Mobile 6 SDK\Samples\Smartphone\cpp\Win32\Currency\PPCCur\ExMan.cpp
我看了一下,SDK中没有Smartphone的例子代码,你能不能发给我一份?
279578853@qq.com
谢谢.
那还有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.
我发的例子中有VALUENEXTEQUAL的使用方法。
但只是seek单个字段的。
你先试试单个的,成功后再试多个的。慢慢找了。
那个例子里没有用VALUENEXTEQUAL的,不过这个我已经搞定了,是因为index变量我重用了,但在第一次Seek的时候已经写了值进去了.
现的问题是CeSeekDatabase真的可以用来查多个字段吗?
如果不能的话,那帮助文档说的那个数组是什么,难道是这个字段的不同值?如我值PID_NO等1和2的所有记录.
但我这样也试了,效果还是和查一个字段一样,等把dwNumValue设成2时就报错,只能设成1.
请问lenux,你有做这个吗?
唉!郁闷啊.
好象照帮助文档里说的来看的话,貌似不行.发现这个数据库功能真的不怎么样啊.
了解这个数据库的人也非常少,这下子真的郁闷了.
想找个做个这个数据库备份与还原的人交流交流.
这个是小型数据库,保存少量数据的。
我是直接从头到尾检查一遍来处理seek功能的。
现在也很少用这个东西了。
嗯,我知道,我以前也是用的这个方法。
现在没招了,只能回到用这种方法。
能不能在请教你一个问题。这个数据库里面不有有些特别的字段吗(BLOB),我想比对这些字段,但还不知道怎么读出来。SDK里有个例子把联系人的图片读出来了,但是好象不能用来比对两个BLOB。MSDN上介绍说好象要用流的方法来处理,不过说的不怎么多,你对这个了解吗?能不能介绍一下,或给个例子让我研究。
谢谢!
BLOB的可是字节流,BYTE*的,要比较估计需要一个比较好算法才行的。不然容易出错,且很慢。
要查找一个的话,
还要在CEDBASEINFOEX定义下SORTORDERSPECEX这个变量,
比如你要查找PID_NAME这个字段,
- SORTORDERSPECEX sortInfo;
- memset(&sortInfo,0,sizeof(sortInfo));
- sortInfo.wVersion = 1;
- sortInfo.wNumProps=1;
- sortInfo.wKeyFlags = 1; //SET IT FOR KEY
- sortInfo.rgPropID[0] =PID_NAME;
- sortInfo.rgdwFlags[0] = CEDB_SORT_DESCENDING; //DEFAULT SET
- DBInfo.rgSortSpecs[0] = sortInfo;
- //然后定义你要查找的字段:
- CEPROPVAL ceSearchProp ;
- ceSearchProp.propid = PID_NAME;
- ceSearchProp.wFlags = 0;
- ceSearchProp.wLenData = 0;
- ceSearchProp.val.lpwstr = _T("name1");
- Oid = CeSeekDatabase(hMyOpenDB, CEDB_SEEK_BEGINNING, 0, NULL/*&dwTempIndex*/);
- 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的错误码)。
要查找多个字段,每行读出来一个个比了。
呵呵..
先不说BLOB怎么比对,问题是我还不知道怎么读出来呢。
用CeOpenStream的话,就在这里过不去了,
可能是压缩过了,所以不能用这种方法吗?
有谁读过啊!!!