EDB 数据库写入和读取的问题

ziamhitler 2008-09-25 04:37:55
我参照这里的例子建好了我的数据库。
http://www.cppblog.com/zhangyq/archive/2008/08/11/58511.aspx?opt=admin
写入数据库的代码:
CEPROPVAL pProp[4];

pProp[0].propid = CEVT_LPWSTR;
pProp[0].wFlags = 0;
pProp[0].wLenData = 0;
pProp[0].val.lpwstr = L"ABC";
.......

for(int i = 0; i < 16; i++)
{
oid = CeWriteRecordProps(hd, 0, 4, pProp);
}
读取的代码:
oid = CeSeekDatabaseEx(hd, CEDB_SEEK_BEGINNING, 0, 0, NULL);

while(ceoidFindRecord = CeReadRecordPropsEx(hd, CEDB_ALLOWREALLOC,
&dwPropId, NULL, &lpRecProps, &dwSizeOfBuffer, NULL))
{
if(GetLastError() != ERROR_NO_MORE_ITEMS)
{
pCePropVal = (PCEPROPVAL)lpRecProps;
LPWSTR lpnum;
lpnum = pCePropVal[0].val.lpwstr;
lpnum = pCePropVal[1].val.lpwstr;
lpnum = pCePropVal[2].val.lpwstr;
lpnum = pCePropVal[3].val.lpwstr;
}
}
数据写入和读取都成功,但是读取到的数据只有pCePropVal[0].val.lpwstr这个值是正确的,其它为空或者为错误的指针。而且pCePropVal[0].val.lpwstr的内容是pProp[3].val.lpwstr = L"JKL"。为什么只有pCePropVal[0].val.lpwstr有值呢?
我对参考例子的理解是,例子中建立一个有4列的表,我写入数据时写入了一行,读取数据时我读取整行。但测试结果给我感觉是我写入数据时只写入了一行中的一列,所以读取时只有pCePropVal[0].val.lpwstr有值。
请知道的朋友说一下是怎么回事啊,谢谢!
...全文
200 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ziamhitler 2008-09-26
  • 打赏
  • 举报
回复
非常感谢楼上的回复!我的CEPROPVAL pProp[4]; 确实这4个propid都是CEVT_LPWSTR。
想问问CEPROPID中的高位用来标志一个序号,那么这个序号是干什么用的呢?
我要创建一个有4列的数据库,每一列都为CEVT_LPWSTR,我应该怎样定义呢?
谢谢!
ziamhitler 2008-09-26
  • 打赏
  • 举报
回复
问题解决,贴上代码共享!

#ifndef EDB
#define EDB
#endif

extern "C"
{
#include <Windbase_edb.h>
};

#define VOLUME_PATH _T("mydb.db")

#define MAKEPROP(n,t) ((n<<16)|CEVT_##t)
#define PROPID_MASK 0x0000FFFF
#define PROPID_NAME MAKEPROP(101,LPWSTR)
#define PROPID_DESCRIPTION MAKEPROP(102,LPWSTR)
#define PROPID_ID MAKEPROP(103,LPWSTR)
#define PROPID_REMARK MAKEPROP(104,LPWSTR)

BOOL CreateDataBase()
{
BOOL ret = FALSE;
CEGUID guid ;
CEOID oid;
HANDLE hd = NULL;

CEDBASEINFOEX info =
{
2,
0,
(CEDB_VALIDNAME | CEDB_VALIDTYPE | CEDB_VALIDSORTSPEC),
_T("Table1"),
0x777,
4,
0,
{0,},
};

CEPROPSPEC CEPropSpec[4];
CEPropSpec[0].wVersion = 1;
CEPropSpec[0].propid = PROPID_NAME;
CEPropSpec[0].dwFlags = 0;
CEPropSpec[0].pwszPropName = TEXT("FileName");
CEPropSpec[0].cchPropName = CEDB_MAXDBASENAMELEN;

CEPropSpec[1].wVersion = 1;
CEPropSpec[1].propid = PROPID_DESCRIPTION;
CEPropSpec[1].dwFlags = 0;
CEPropSpec[1].pwszPropName = TEXT("Description");
CEPropSpec[1].cchPropName = CEDB_MAXDBASENAMELEN;

CEPropSpec[2].wVersion = 1;
CEPropSpec[2].propid = PROPID_ID;
CEPropSpec[2].dwFlags = 0;
CEPropSpec[2].pwszPropName = TEXT("ID");
CEPropSpec[2].cchPropName = CEDB_MAXDBASENAMELEN;

CEPropSpec[3].wVersion = 1;
CEPropSpec[3].propid = PROPID_REMARK;
CEPropSpec[3].dwFlags = 0;
CEPropSpec[3].pwszPropName = TEXT("Remark");
CEPropSpec[3].cchPropName = CEDB_MAXDBASENAMELEN;


ret = CeMountDBVolEx(&guid, VOLUME_PATH, NULL, CREATE_ALWAYS);
if(ret == FALSE)
{
return FALSE;
}

if((oid = CeCreateDatabaseWithProps(&guid, &info, 0, CEPropSpec)) == NULL)
{
CeUnmountDBVol(&guid);
return FALSE;
}

if((hd = CeOpenDatabaseInSession(NULL, &guid, &oid, NULL, NULL, 0, NULL)) == INVALID_HANDLE_VALUE)
{
CeUnmountDBVol(&guid);
return FALSE;
}

CEPROPVAL pProp[4];

pProp[0].propid = PROPID_NAME;
pProp[0].wFlags = 0;
pProp[0].val.lpwstr = L"ABC";

pProp[1].propid = PROPID_DESCRIPTION;
pProp[1].wFlags = 0;
pProp[1].val.lpwstr = L"DEF";

pProp[2].propid = PROPID_ID;
pProp[2].wFlags = 0;
pProp[2].val.lpwstr = L"GHI";

pProp[3].propid = PROPID_REMARK;
pProp[3].wFlags = 0;
pProp[3].val.lpwstr = L"JKL";

for(int i = 0; i < 16; i++)
{
oid = CeWriteRecordProps(hd, 0, 4, pProp);
}

CeFlushDBVol(&guid);
CloseHandle(hd);
CeUnmountDBVol(&guid);

return TRUE;
}

BOOL ReadDataBase()
{
HANDLE hd = NULL;
CEGUID guid;
CEOID oid = 0;
BOOL ret = FALSE;

if((ret = CeMountDBVolEx(&guid, VOLUME_PATH, NULL, OPEN_EXISTING)) == FALSE)
{
return FALSE;
}

if((hd = CeOpenDatabaseInSession(NULL, &guid, &oid, _T("Table1"), NULL,
CEDB_AUTOINCREMENT, NULL)) == INVALID_HANDLE_VALUE)
{
DWORD err;
err = GetLastError();
if(err == ERROR_FILE_NOT_FOUND)
CeUnmountDBVol(&guid);
return FALSE;
}

WORD dwPropId = 0;
DWORD dwSizeOfBuffer = 512;
CEOID ceoidFindRecord = 0;
LPBYTE lpRecProps = NULL;
PCEPROPVAL pCePropVal = NULL;
int count = 0;

oid = CeSeekDatabaseEx(hd, CEDB_SEEK_BEGINNING, 0, 0, NULL);

while(ceoidFindRecord = CeReadRecordPropsEx(hd, CEDB_ALLOWREALLOC,
&dwPropId, NULL, &lpRecProps, &dwSizeOfBuffer, NULL))
{
if(GetLastError() != ERROR_NO_MORE_ITEMS)
{
count++;
pCePropVal = (PCEPROPVAL)lpRecProps;
LPWSTR lpnum;
lpnum = pCePropVal[0].val.lpwstr;
lpnum = pCePropVal[1].val.lpwstr;
lpnum = pCePropVal[2].val.lpwstr;
lpnum = pCePropVal[3].val.lpwstr;
}
}

if(lpRecProps)
{
LocalFree(lpRecProps);
lpRecProps = NULL;
}
CloseHandle(hd);

CeUnmountDBVol(&guid);

return TRUE;
}
jinhaijian 2008-09-25
  • 打赏
  • 举报
回复
你的pProp[0].propid = CEVT_LPWSTR 有问题。如果你的CEPROPVAL pProp[4]; 这四个中的propid都是CEVT_LPWSTR那就是问题的。
propid是唯一标记一个数据库中的列的。

一般通过下面的方式
#define MAKEPROP(n,t) ((n<<16)|t)
#define PROPID_ID1 MAKEPROP(101,CEVT_LPWSTR)
#define PROPID_ID2 MAKEPROP(102,CEVT_LPWSTR)
CEPROPID 是DWORD类型,高为是用来标志一个序号,低位标志它的数据类型,
在windbase_edb.h中有这些东西:

#define CEVT_I2 2
#define CEVT_UI2 18
#define CEVT_I4 3
#define CEVT_UI4 19
#define CEVT_FILETIME 64
#define CEVT_LPWSTR 31
#define CEVT_BLOB 65
#define CEVT_BOOL 11
#define CEVT_R8 5

7,655

社区成员

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

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