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

时间:2022-09-04 19:05:55
我现在要在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 个解决方案

#1


补充一下

是VS2005+PPC6.0

#2


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<TCHAR*>(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

#3


我看了一下,SDK中没有Smartphone的例子代码,你能不能发给我一份?
279578853@qq.com

谢谢.

#4


已发

#5


那还有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.

#6


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

但只是seek单个字段的。

你先试试单个的,成功后再试多个的。慢慢找了。

#7


那个例子里没有用VALUENEXTEQUAL的,不过这个我已经搞定了,是因为index变量我重用了,但在第一次Seek的时候已经写了值进去了.

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

请问lenux,你有做这个吗?

#8


没有用过seek,

#9


唉!郁闷啊.
好象照帮助文档里说的来看的话,貌似不行.发现这个数据库功能真的不怎么样啊.

了解这个数据库的人也非常少,这下子真的郁闷了.
想找个做个这个数据库备份与还原的人交流交流.

#10


这个是小型数据库,保存少量数据的。

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

现在也很少用这个东西了。

#11


嗯,我知道,我以前也是用的这个方法。
现在没招了,只能回到用这种方法。

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


谢谢!

#12


BLOB的可是字节流,BYTE*的,要比较估计需要一个比较好算法才行的。不然容易出错,且很慢。

#13


要查找一个的话,
还要在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的错误码)。

要查找多个字段,每行读出来一个个比了。
呵呵..

#14


先不说BLOB怎么比对,问题是我还不知道怎么读出来呢。
用CeOpenStream的话,就在这里过不去了,
可能是压缩过了,所以不能用这种方法吗?
有谁读过啊!!!

#1


补充一下

是VS2005+PPC6.0

#2


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<TCHAR*>(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

#3


我看了一下,SDK中没有Smartphone的例子代码,你能不能发给我一份?
279578853@qq.com

谢谢.

#4


已发

#5


那还有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.

#6


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

但只是seek单个字段的。

你先试试单个的,成功后再试多个的。慢慢找了。

#7


那个例子里没有用VALUENEXTEQUAL的,不过这个我已经搞定了,是因为index变量我重用了,但在第一次Seek的时候已经写了值进去了.

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

请问lenux,你有做这个吗?

#8


没有用过seek,

#9


唉!郁闷啊.
好象照帮助文档里说的来看的话,貌似不行.发现这个数据库功能真的不怎么样啊.

了解这个数据库的人也非常少,这下子真的郁闷了.
想找个做个这个数据库备份与还原的人交流交流.

#10


这个是小型数据库,保存少量数据的。

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

现在也很少用这个东西了。

#11


嗯,我知道,我以前也是用的这个方法。
现在没招了,只能回到用这种方法。

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


谢谢!

#12


BLOB的可是字节流,BYTE*的,要比较估计需要一个比较好算法才行的。不然容易出错,且很慢。

#13


要查找一个的话,
还要在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的错误码)。

要查找多个字段,每行读出来一个个比了。
呵呵..

#14


先不说BLOB怎么比对,问题是我还不知道怎么读出来呢。
用CeOpenStream的话,就在这里过不去了,
可能是压缩过了,所以不能用这种方法吗?
有谁读过啊!!!