⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysedb.cpp

📁 Windows Mobile 5.0/6.0下EDB的使用的完整的例子程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "SysEDB.h"

const CEPROPID NamePropid = MAKELONG(CEVT_LPWSTR,0);			// 名字propid
const CEPROPID PhoneNumberPropid = MAKELONG(CEVT_LPWSTR,1);			// 号码propid
const CEPROPID OrderPropid = MAKELONG(CEVT_UI4,0);				// 排序的序号propid

const CEPROPID StreamDataPropid = MAKELONG(CEVT_BLOB,0);				// Item结构的propid

UINT GetCurrAppFolder(TCHAR* appFolder)
{
	TCHAR lpFileName[128];
	TCHAR lpFolderName[128];
	TCHAR k='\\';
	int charNumber=GetModuleFileName(NULL, lpFileName, 128);
	for(int i=charNumber-1;i>=0;i--)
	{
		if(lpFileName[i]==k)
		{
			wcsncpy(lpFolderName,lpFileName,i+1);
			lpFolderName[i+1]='\0';
			break;
		}
	}

	return wsprintf(appFolder,TEXT("%s"),lpFolderName);
}

//创建数据库
BOOL CSysDB::CreateDBEx(LPTSTR apsDBVolPath)
{
	CEGUID ceGuidInitDB;

	if(FALSE == CeMountDBVolEx(&ceGuidInitDB, apsDBVolPath, 0, OPEN_ALWAYS ))
	{        
		return FALSE;
	}

	CEDBASEINFOEX ced;
	memset(&ced, 0, sizeof(CEDBASEINFOEX)) ;
	ced.wVersion = CEDBASEINFOEX_VERSION;
	ced.dwSize = sizeof(CEDBASEINFOEX);
	ced.dwFlags = CEDB_VALIDNAME|  CEDB_VALIDSORTSPEC; 

	//wcscpy(ced.szDbaseName, L"Prefix"); // 数据库的名字
	wcscpy(ced.szDbaseName, DB_NAME); // 数据库的名字
	//ced.wNumSortOrder = 2;	// 1种排序方式
	ced.wNumSortOrder = 1;	// 1种排序方式

	// 排序方式,把电话号码做为主键,不允许重复。
	ced.rgSortSpecs[0].wVersion = SORTORDERSPECEX_VERSION;
	ced.rgSortSpecs[0].wNumProps = 1;
	if(m_bSetPrimaryKey)
		ced.rgSortSpecs[0].wKeyFlags = CEDB_SORT_PRIMARYKEY;
	else
		ced.rgSortSpecs[0].wKeyFlags = 0 ;

	ced.rgSortSpecs[0].rgPropID[0] = PhoneNumberPropid; // 默认升序排列

	DWORD wProps = 2;
	CEPROPSPEC propSpec[2];
	memset(propSpec,0,sizeof(CEPROPSPEC)*wProps);	

	propSpec[0].wVersion = 1;
	propSpec[0].propid = NamePropid;
	propSpec[0].dwFlags = DB_PROP_NOTNULL;

	propSpec[1].wVersion = 1;
	propSpec[1].propid = PhoneNumberPropid;
	propSpec[1].dwFlags = DB_PROP_NOTNULL;

	//	propSpec[2].wVersion = 1;
	//	propSpec[2].propid = OrderPropid;
	//	propSpec[2].dwFlags = DB_PROP_NOTNULL;

	CEOID oid = CeCreateDatabaseWithProps(&ceGuidInitDB,&ced,wProps,propSpec);
	if( NULL ==oid )
	{
		CeUnmountDBVol(&ceGuidInitDB);
		return FALSE;
	}
	CeUnmountDBVol(&ceGuidInitDB);
	return TRUE;
}

//创建流数据库
BOOL CSysDB::CreateStreamDB(LPTSTR apsDBVolPath)
{
	CEGUID ceGuidInitDB;

	if(FALSE == CeMountDBVolEx(&ceGuidInitDB, apsDBVolPath, 0, OPEN_ALWAYS ))
	{        
		return FALSE;
	}

	CEDBASEINFOEX ced;
	memset(&ced, 0, sizeof(CEDBASEINFOEX)) ;
	ced.wVersion = CEDBASEINFOEX_VERSION;
	ced.dwSize = sizeof(CEDBASEINFOEX);
	ced.dwFlags = CEDB_VALIDNAME|  CEDB_VALIDSORTSPEC; 

	//wcscpy(ced.szDbaseName, L"Prefix"); // 数据库的名字
	wcscpy(ced.szDbaseName, STREAM_DB_NAME); // 数据库的名字
	//ced.wNumSortOrder = 2;	// 1种排序方式
	ced.wNumSortOrder = 1;	// 1种排序方式

	// 排序方式,把电话号码做为主键,不允许重复。
	ced.rgSortSpecs[0].wVersion = SORTORDERSPECEX_VERSION;
	ced.rgSortSpecs[0].wNumProps = 1;
//	if(m_bSetPrimaryKey)
//		ced.rgSortSpecs[0].wKeyFlags = CEDB_SORT_PRIMARYKEY;
//	else
		ced.rgSortSpecs[0].wKeyFlags = 0 ;

	ced.rgSortSpecs[0].rgPropID[0] = StreamDataPropid; // 默认升序排列

	DWORD wProps = 1;
	CEPROPSPEC propSpec[1];
	memset(propSpec,0,sizeof(CEPROPSPEC)*wProps);	

	propSpec[0].wVersion = 1;
	propSpec[0].propid = StreamDataPropid;
	propSpec[0].dwFlags = DB_PROP_NOTNULL;

//	propSpec[1].wVersion = 1;
//	propSpec[1].propid = PhoneNumberPropid;
//	propSpec[1].dwFlags = DB_PROP_NOTNULL;

	//	propSpec[2].wVersion = 1;
	//	propSpec[2].propid = OrderPropid;
	//	propSpec[2].dwFlags = DB_PROP_NOTNULL;

	CEOID oid = CeCreateDatabaseWithProps(&ceGuidInitDB,&ced,wProps,propSpec);
	if( NULL ==oid )
	{
		CeUnmountDBVol(&ceGuidInitDB);
		return FALSE;
	}
	CeUnmountDBVol(&ceGuidInitDB);
	return TRUE;
}


/*
// 创建存储拨号前缀的数据库
BOOL CreateDB(LPTSTR apsDBVolPath)
{
	CEGUID ceGuidInitDB;

	if(FALSE == CeMountDBVolEx(&ceGuidInitDB, apsDBVolPath, 0, OPEN_ALWAYS ))
	{        
		return FALSE;
	}

	CEDBASEINFOEX ced;
	memset(&ced, 0, sizeof(CEDBASEINFOEX)) ;
	ced.wVersion = CEDBASEINFOEX_VERSION;
	ced.dwSize = sizeof(CEDBASEINFOEX);
	ced.dwFlags = CEDB_VALIDNAME|  CEDB_VALIDSORTSPEC; 

	//wcscpy(ced.szDbaseName, L"Prefix"); // 数据库的名字
	wcscpy(ced.szDbaseName, DB_NAME); // 数据库的名字
	//ced.wNumSortOrder = 2;	// 1种排序方式
	ced.wNumSortOrder = 1;	// 1种排序方式

	// 排序方式,把电话号码做为主键,不允许重复。
	ced.rgSortSpecs[0].wVersion = SORTORDERSPECEX_VERSION;
	ced.rgSortSpecs[0].wNumProps = 1;	
	ced.rgSortSpecs[0].wKeyFlags = CEDB_SORT_PRIMARYKEY ;
	ced.rgSortSpecs[0].rgPropID[0] = PhoneNumberPropid; // 默认升序排列


	
	// 排序方式2,把OrderID按照降序排序
//	ced.rgSortSpecs[1].wVersion = SORTORDERSPECEX_VERSION;
//	ced.rgSortSpecs[1].wNumProps = 1;	
//	ced.rgSortSpecs[1].wKeyFlags =CEDB_SORT_UNIQUE;
//	ced.rgSortSpecs[1].rgPropID[0] = OrderPropid; 
//	ced.rgSortSpecs[1].rgdwFlags[0] = CEDB_SORT_DESCENDING;  // 降序排列
	
	// 设置每个字段的属性值
	//	DWORD wProps = 3;
	//	CEPROPSPEC propSpec[3];
	//	memset(propSpec,0,sizeof(CEPROPSPEC)*wProps);	

	DWORD wProps = 2;
	CEPROPSPEC propSpec[2];
	memset(propSpec,0,sizeof(CEPROPSPEC)*wProps);	

	propSpec[0].wVersion = 1;
	propSpec[0].propid = NamePropid;
	propSpec[0].dwFlags = DB_PROP_NOTNULL;

	propSpec[1].wVersion = 1;
	propSpec[1].propid = PhoneNumberPropid;
	propSpec[1].dwFlags = DB_PROP_NOTNULL;

	//	propSpec[2].wVersion = 1;
	//	propSpec[2].propid = OrderPropid;
	//	propSpec[2].dwFlags = DB_PROP_NOTNULL;

	CEOID oid = CeCreateDatabaseWithProps(&ceGuidInitDB,&ced,wProps,propSpec);
	if( NULL ==oid )
	{
		CeUnmountDBVol(&ceGuidInitDB);
		return FALSE;
	}
	else	// 至此数据库成功创建
	{
		// 创建预设分组
		HANDLE hDB =  CeOpenDatabaseInSession(NULL,&ceGuidInitDB,&oid,NULL,NULL,CEDB_AUTOINCREMENT,NULL);
		if(hDB != INVALID_HANDLE_VALUE)
		{		
			WORD wProps = 3;
			CEPROPVAL propVal[3];
			memset(propVal,0,sizeof(CEPROPVAL)*3);

			propVal[0].propid = NamePropid;
			propVal[1].propid = PhoneNumberPropid;
			propVal[2].propid = OrderPropid;

			propVal[0].val.lpwstr = L"Voice Modulation";	
			propVal[1].val.lpwstr = L"*77";
			propVal[2].val.ulVal = 1;
			CeWriteRecordProps(hDB,0,wProps,propVal); 

			propVal[0].val.lpwstr = L"Voice SMS";
			propVal[1].val.lpwstr = L"*88";		
			propVal[2].val.ulVal = 2;
			CeWriteRecordProps(hDB,0,wProps,propVal); 

			propVal[0].val.lpwstr = L"Voice Music SMS";
			propVal[1].val.lpwstr = L"*89";		
			propVal[2].val.ulVal = 3;
			CeWriteRecordProps(hDB,0,wProps,propVal); 
			
			CloseHandle(hDB);
		}

	}
	CeUnmountDBVol(&ceGuidInitDB);
	return TRUE;
}
*/

CSysDB::CSysDB(BOOL bSetPrimarykey , LONG iSeekOrder)
{
	m_bInitial = FALSE;
	m_hDB = INVALID_HANDLE_VALUE;
	m_dwMaxPrefixOrderID = 0;
	m_iSeekOrder = iSeekOrder;
	m_bSetPrimaryKey = bSetPrimarykey;
	//Initial(); // 初始化
}

CSysDB::~CSysDB()
{
	if(INVALID_HANDLE_VALUE != m_hDB)	// 关闭打开的数据库
	{
		CloseHandle(m_hDB);
	}	
	CeUnmountDBVol(&m_ceGuidDB); // 卸载数据库卷
}


BOOL CSysDB::OpenDB(TCHAR *szwDBName)
{
	if(m_bInitial)	// 已经初始化
	{
		return TRUE; // 返回TRUE
	}

	TCHAR path[256];
	TCHAR dbPath[256];
	GetCurrAppFolder(path);
	//wsprintf(dbPath,L"%s\\%s",path,L"db5.vol");
	//wsprintf(dbPath,L"%s\\%s",path,L"SmsBList.dat");
	wsprintf(dbPath,L"%s\\%s",path,szwDBName);


	//if( CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
	//if( CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
	if(!CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
	{
		CreateDBEx(dbPath);
		if(!CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
			return FALSE;
	}
	{
		CEOID oidb = 0;	

		/*		SORTORDERSPECEX sort;
		memset(&sort,0,sizeof(SORTORDERSPECEX));
		// 排序方式2,把OrderID按照降序排序
		sort.wVersion = SORTORDERSPECEX_VERSION;
		sort.wNumProps = 1;	
		sort.wKeyFlags =CEDB_SORT_UNIQUE;
		sort.rgPropID[0] = OrderPropid; 
		sort.rgdwFlags[0] = CEDB_SORT_DESCENDING;  // 降序排列
		*/

		oidb = 0;
		//m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb,L"Prefix",&sort,CEDB_AUTOINCREMENT,NULL);
		//m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb, DB_NAME,&sort,CEDB_AUTOINCREMENT,NULL);
		m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb, DB_NAME,NULL,CEDB_AUTOINCREMENT,NULL);

		if(INVALID_HANDLE_VALUE != m_hDB ) // 成功打开数据库
		{
			m_bInitial =TRUE;
			m_dwMaxPrefixOrderID = GetMaxPrefixOrderID();
			return TRUE;
		}

		CeUnmountDBVol(&m_ceGuidDB);
	}

	return FALSE;
}

BOOL CSysDB::OpenStreamDB(TCHAR *szwDBName)
{
	if(m_bInitial)	// 已经初始化
	{
		return TRUE; // 返回TRUE
	}

	TCHAR path[256];
	TCHAR dbPath[256];
	GetCurrAppFolder(path);
	//wsprintf(dbPath,L"%s\\%s",path,L"db5.vol");
	//wsprintf(dbPath,L"%s\\%s",path,L"SmsBList.dat");
	wsprintf(dbPath,L"%s\\%s",path,szwDBName);


	//if( CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
	//if( CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
	if(!CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
	{
		CreateStreamDB(dbPath);
		if(!CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
			return FALSE;
	}
	{
		CEOID oidb = 0;	

		/*		SORTORDERSPECEX sort;
		memset(&sort,0,sizeof(SORTORDERSPECEX));
		// 排序方式2,把OrderID按照降序排序
		sort.wVersion = SORTORDERSPECEX_VERSION;
		sort.wNumProps = 1;	
		sort.wKeyFlags =CEDB_SORT_UNIQUE;
		sort.rgPropID[0] = OrderPropid; 
		sort.rgdwFlags[0] = CEDB_SORT_DESCENDING;  // 降序排列
		*/

		oidb = 0;
		//m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb,L"Prefix",&sort,CEDB_AUTOINCREMENT,NULL);
		//m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb, DB_NAME,&sort,CEDB_AUTOINCREMENT,NULL);
		m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb, STREAM_DB_NAME,NULL,CEDB_AUTOINCREMENT,NULL);

		if(INVALID_HANDLE_VALUE != m_hDB ) // 成功打开数据库
		{
			m_bInitial =TRUE;
			//m_dwMaxPrefixOrderID = GetMaxPrefixOrderID();
			return TRUE;
		}

		CeUnmountDBVol(&m_ceGuidDB);
	}

	return FALSE;
}



void CSysDB::CloseDBHandle()
{
	if(INVALID_HANDLE_VALUE != m_hDB)	// 关闭打开的数据库
	{
		CloseHandle(m_hDB);
		m_hDB = INVALID_HANDLE_VALUE;
	}	
	CeUnmountDBVol(&m_ceGuidDB); // 卸载数据库卷
	m_bInitial = FALSE;	// 初始化开关设为false
}


DWORD CSysDB::AddDBItem(ITEMData &item)
{
	//BOOL rs = FALSE;
	if(!m_bInitial)	// 没有初始化
	{
		return FALSE; //  返回false
	}

	//WORD wProps = 3;
	//CEPROPVAL propVal[3];
	//memset(propVal,0,sizeof(CEPROPVAL)*3);
	WORD wProps = 2;
	CEPROPVAL propVal[2];
	memset(propVal,0,sizeof(CEPROPVAL)*2);

	propVal[0].propid = NamePropid;
	propVal[0].val.lpwstr = item.name;

	propVal[1].propid = PhoneNumberPropid;
	propVal[1].val.lpwstr = item.number;

	//	propVal[2].propid = OrderPropid;
	//	propVal[2].val.ulVal = ++m_dwMaxPrefixOrderID;

	CEOID oidRecord = CeWriteRecordProps(m_hDB,0,wProps,propVal);
	DWORD errCoe = GetLastError();
	if(errCoe == ERROR_ALREADY_EXISTS)
	{
		return errCoe;
	}
	//ERROR_ALREADY_EXISTS
	if(oidRecord != 0)
	{
		item.ceoid = oidRecord;
		//rs = TRUE;
	}
	return errCoe;
	//return rs;
}

DWORD CSysDB::AddStreamDBItem(ITEMData &item)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -