﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-WINCE &amp; EVC &amp; Platform Builder-随笔分类-数据库</title><link>http://www.cppblog.com/hkingSP/category/3911.html</link><description>in ShangHai,</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 20:35:08 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 20:35:08 GMT</pubDate><ttl>60</ttl><item><title>MFC 数据库操作</title><link>http://www.cppblog.com/hkingSP/archive/2007/03/28/20779.html</link><dc:creator>宋鹏</dc:creator><author>宋鹏</author><pubDate>Wed, 28 Mar 2007 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/hkingSP/archive/2007/03/28/20779.html</guid><wfw:comment>http://www.cppblog.com/hkingSP/comments/20779.html</wfw:comment><comments>http://www.cppblog.com/hkingSP/archive/2007/03/28/20779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/hkingSP/comments/commentRss/20779.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/hkingSP/services/trackbacks/20779.html</trackback:ping><description><![CDATA[随着掌上电脑的迅速崛起,微软推出的运行在掌上电脑上的操作系统Windows CE越来越引人瞩目。 <br />　　Windows CE包括一个Win32 API子集,一个适宜于静态、动态内存存储的文件系统等。根据需要,还增加了一些Windows所没有的特性,增加了一些新的API(包括一些新的数据库API)。其中数据库被定位在对象存储(Object Store)中。对象存储是掌上电脑内存的一部分,是操作系统分配来存储永久文件、注册表、Windows CE 数据库的。掌上电脑剩余的内存是应用程序内存,供应用程序使用。 <br />　　Windows CE中用来操作数据库的函数有:打开数据库CeOpenDatabase(); 关闭数据库CloseHandle(); 删除纪录CeDeleteRecord等。 <br />　　Windows CE上数据库的一些附加特性也是很有意思的，如数据库支持“time stamps”，这个特性让开发者可以测试自上次读数据后是否有别的程序修改了数据。 <br />　　下面让我们详细介绍Windows CE上的数据库编程(开发工具:VC 5.0,WindowsCE ToolKit for VC 5.0)。 <br /><br />　　 基本数据库操作 <br /><br />　　1.创建数据库 <br /><br />　　void CMyDB::CreateDatabase() <br />　　{ <br />　　 CCeDBDatabase db; <br />　　 // 检查数据库是否存在 <br />　　 if(!CCeDBDatabase::Exists(_T("My Database")))  <br />　　 { <br />　　 //如果数据库不存在,就创建它 <br />　　 db.Create(_T("My Database")); <br />　　 }  <br />　　} <br /><br />　　2.打开数据库 <br /><br />　　CCeDBDatabase db; <br />　　db.Open(_T(″My Database″));  <br /><br /><br />　　3.删除数据库 <br />　　CCeDBDatabase db;  <br />　　if (db.Open(_T(″My Database″)))  <br />　　 db.Delete(); <br /><br />　　4.关闭数据库 <br /><br />　　CCeDBDatabase db;  <br />　　db.Open(_T(″My Database″)); <br />　　db.Close(); <br /><br />　　向数据库中加入纪录 <br /><br />　　这里我向大家介绍另两个数据库类:CCeDBRecord,CCeDBProp。 <br /><br />　　创建数据库时,我们可以同时定义字段,然后设置纪录变量的各字段值,最后将记录加入到数据库中。 <br /><br />　　 // Create database <br />　　 const DWORD DB_IDENT_ID = 11111; <br />　　 const WORD PROP_NAME=101,PROP_AGE=102,PROP_GENDER=103; <br />　　 CCeDBDatabase db ; <br />　　 CEOID poid;  <br />　　 CCeDBProp dbprops[3] = { <br />　　 CCeDBProp(CCeDBProp::Type_String,PROP_NAME,CCeDBProp::Sort_Ascending), <br />　　 CCeDBProp(CCeDBProp::Type_UShort,PROP_AGE,CCeDBProp::Sort_Descending), <br />　　 CCeDBProp(CCeDBProp::Type_UShort,PROP_GENDER,CCeDBProp::Sort_UnknownFirst)  <br />　　 }; <br /><br />　　 if(!(poid = db.Create((_T("My DB"),DB_IDENT_ID,3,dbprops)))  <br />　　 return FALSE; <br />　　 if(!db.Open(poid)) return FALSE; <br /><br /><br />　　 // Add records <br />　　 CCeDBRecord rec; <br />　　 CCeDBProp props[3];  <br />　　 props[0] = CCeDBProp(_T("LiMing"),PROP_NAME); <br />　　 props[1] = CCeDBProp((USHORT)20, PROP_AGE); <br />　　 props[2] = CCeDBProp((USHORT)'M',PROP_GENDER); <br />　　 rec.AddProps(props,3); <br />　　 if(!db.AddRecord(＆rec)) return FALSE; <br /><br />　　从数据库中检索纪录 <br /><br />　　我们可以通过调用CCeDBDatabase::GetNumRecords()获取纪录数。通过CCeDBDatabase::GetCurrRecord()获取每个纪录的指针。 <br /><br />　　 BOOL bPrev = pdb－〉m_bAutoSeekNext; <br />　　 pdb－〉m_bAutoSeekNext = TRUE; <br />　　 pdb－〉SeekFirst(); <br />　　 while(pdb－〉ReadCurrRecord(＆rec)) <br />　　 MyPrintRecord(＆rec);//处理数据(显示记录) <br />　　 pdb－〉m_bAutoSeekNext = bPrev; <br /><br /><br />　　通过调用CCeDBRecord::GetPropFromIdent()获取每个字段值。 <br /><br />　　 pPropName=prec－〉GetPropFromIdent(PROP_NAME); <br />　　 LPWSTR strName=pPropName－〉GetString(); <br />　　除了可以遍历数据库纪录外,还可按条件查找纪录,如:查找具有指定属性的记录。 <br />　　CCeDBProp prop; <br /><br /><br />　　 ....//设置待查找纪录的属性 <br />　　 db.SeekFirstEqual(＆prop); <br />　　 从数据库中删除纪录 <br /><br /><br />　　//先查找指定纪录 <br />　　db.DeleteCurrRecord(); <br /><br /><br />　　 修改数据库中纪录 <br /><br />　　 CCeDBRecord rec; <br />　　 ....//查找待修改的记录 <br /><br /><br />　　 ....//修改记录的属性  <br /><br /><img src ="http://www.cppblog.com/hkingSP/aggbug/20779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hkingSP/" target="_blank">宋鹏</a> 2007-03-28 16:45 <a href="http://www.cppblog.com/hkingSP/archive/2007/03/28/20779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库完整操作 </title><link>http://www.cppblog.com/hkingSP/archive/2007/03/28/DataBaseAPI.html</link><dc:creator>宋鹏</dc:creator><author>宋鹏</author><pubDate>Wed, 28 Mar 2007 08:22:00 GMT</pubDate><guid>http://www.cppblog.com/hkingSP/archive/2007/03/28/DataBaseAPI.html</guid><wfw:comment>http://www.cppblog.com/hkingSP/comments/20776.html</wfw:comment><comments>http://www.cppblog.com/hkingSP/archive/2007/03/28/DataBaseAPI.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/hkingSP/comments/commentRss/20776.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/hkingSP/services/trackbacks/20776.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="90%" border="0">
				<tbody>
						<tr>
								<td class="hang" height="45">
										<strong>
												<font size="3">数据库完整操作</font>
										</strong>
								</td>
						</tr>
						<tr>
								<td class="hang">//定义变量 <br />// build database <br />CEGUID m_ceguid; <br />HANDLE m_hdb=0; <br />CEOID m_ceoid=0; <br />TCHAR DBFILENAME[20] = _T("\\abc.db"); <br />TCHAR DBTABLENAME[20] = _T("\\wang"); <br /><br />//insert database <br />CEOID ceoid =0; <br />CEPROPVAL * pRorps; <br />pRorps = new CEPROPVAL[2]; <br /><br />//read data <br />int iRecordCount; <br />CEOIDINFO oidinfo; <br />DWORD dwIndex; <br />DWORD dwRecSize; <br />WORD wProps; <br />PBYTE pBuff; <br />PCEPROPVAL pRecord; <br />int i; <br />int k; <br />//开始使用 <br />case IDC_INSERT://CREATE DATABASE <br /><br />//1. ¹ÒÔØÊý¾Ý¿â£¬²»´æÔÚÔò½¨Á¢ <br />if (!CeMountDBVol(&amp;m_ceguid,DBFILENAME,OPEN_ALWAYS)) <br />{ <br />MessageBox(NULL,TEXT("faile"),NULL,MB_OK); <br />return 0; <br />} <br />else <br />MessageBox(NULL,TEXT("build DB success"),NULL,MB_OK); <br />//2. ´ò¿ª±í£¬ <br />m_hdb = CeOpenDatabaseEx(&amp;m_ceguid,&amp;m_ceoid,DBTABLENAME,NULL, <br />CEDB_AUTOINCREMENT,NULL); <br />if (m_hdb == INVALID_HANDLE_VALUE) <br />{ <br />//3. ²»´æÔÚÔò½¨Á¢ <br />if (GetLastError() == ERROR_FILE_NOT_FOUND) <br />{ <br />CEDBASEINFO cedbaseinfo; <br />cedbaseinfo.dwFlags = CEDB_VALIDNAME | CEDB_VALIDTYPE <br />| CEDB_VALIDSORTSPEC; <br />wcscpy(cedbaseinfo.szDbaseName,DBTABLENAME); <br />cedbaseinfo.dwDbaseType = 0; <br />cedbaseinfo.wNumSortOrder = 1 ;//ÅÅÐòÊýÄ¿ <br />cedbaseinfo.rgSortSpecs[0].propid = pid_no; <br />cedbaseinfo.rgSortSpecs[0].dwFlags = CEDB_SORT_CASEINSENSITIVE; <br /><br />// <br />m_ceoid = CeCreateDatabaseEx(&amp;m_ceguid,&amp;cedbaseinfo); <br />if(m_ceoid==0) <br />MessageBox(NULL,TEXT("faile"),NULL,MB_OK); <br />else <br />{ <br />m_hdb = CeOpenDatabaseEx(&amp;m_ceguid,&amp;m_ceoid,DBTABLENAME,NULL, <br />CEDB_AUTOINCREMENT,NULL); <br />MessageBox(NULL,TEXT("build table success"),NULL,MB_OK); <br />} <br />} <br /><br /><br />} <br />else <br />MessageBox(NULL,TEXT("open table success"),NULL,MB_OK); <br /><br />///insert record <br /><br />// <br />memset(pRorps,0,LocalSize(pRorps)); <br />pRorps-&gt;propid = pid_no; <br />pRorps-&gt;val.lpwstr = TEXT("1"); <br />// <br />pRorps ++; <br />//memset(pRorps,0,LocalSize(pRorps)); <br />pRorps-&gt;propid = pid_name; <br />pRorps-&gt;val.lpwstr = TEXT("wang"); <br /><br />pRorps --; <br /><br />ceoid = CeWriteRecordProps(m_hdb,0,2,pRorps); <br /><br />if (ceoid == 0) <br />MessageBox(NULL,TEXT("insert failues"),NULL,MB_OK); <br />else <br />MessageBox(NULL,TEXT("insert success"),NULL,MB_OK); <br /><br />//read record <br />//iRecordCount = CeGetRecordCount(&amp;m_ceguid,m_ceoid); <br />CeOidGetInfoEx(&amp;m_ceguid,m_ceoid,&amp;oidinfo); <br />iRecordCount = oidinfo.infDatabase.wNumRecords; <br />wsprintf(DBTABLENAME,TEXT("RECORD IS %d"),iRecordCount); <br />MessageBox(NULL,DBTABLENAME,NULL,NULL); <br />// <br />for( i=0;i<irecordcount;i++)><br />{ <br />ceoid =CeSeekDatabase(m_hdb,CEDB_SEEK_BEGINNING,i,&amp;dwIndex); <br /><br />pBuff=0; <br />ceoid=CeReadRecordProps(m_hdb, <br />CEDB_ALLOWREALLOC, <br />&amp;wProps, <br />NULL, <br />&amp; (LPBYTE)pBuff, <br />&amp;dwRecSize); <br />pRecord =(PCEPROPVAL)pBuff; <br />// <br />for(k=0;k<wprops;k++)><br />{ <br />switch(pRecord-&gt;propid) <br />{ <br />case pid_no: <br />wcscpy(DBTABLENAME,pRecord-&gt;val.lpwstr); <br />MessageBox(NULL,DBTABLENAME,TEXT("NO"),NULL); <br /><br />break; <br />// <br />case pid_name: <br />wcscpy(DBTABLENAME,pRecord-&gt;val.lpwstr); <br />MessageBox(NULL,DBTABLENAME,TEXT("NAME"),NULL); <br /><br />break; <br />} <br />pRecord++; <br />}// <br /><br />LocalFree(pBuff); <br />} <br />//delete <br />ceoid = CeSeekDatabase(m_hdb,CEDB_SEEK_BEGINNING,2,NULL); <br />if( CeDeleteRecord(m_hdb,ceoid)) <br />MessageBox(NULL,_T("DELE success"),NULL,NULL); <br /><br />if(CloseHandle(m_hdb)) <br />MessageBox(NULL,_T("close success"),NULL,NULL); <br /><br />if(CeUnmountDBVol(&amp;m_ceguid)) <br />MessageBox(NULL,_T("unmount success"),NULL,NULL); <br /><br /><br />//search <br /><br /><br />break;</wprops;k++)></irecordcount;i++)></td>
						</tr>
				</tbody>
		</table>
		<br />
<img src ="http://www.cppblog.com/hkingSP/aggbug/20776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hkingSP/" target="_blank">宋鹏</a> 2007-03-28 16:22 <a href="http://www.cppblog.com/hkingSP/archive/2007/03/28/DataBaseAPI.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>