Windows Mobile 平台EDB 数据库的应用与开发
2011年04月26日
Windows Mobile 平台EDB 数据库的应用与开发
程乐乎 1,邹仕洪1,林宇 2,史文勇2
1.北京邮电大学网络技术研究院,北京(100876)
2.北京网秦天下科技有限公司,北京(100013)
E-Mail: clh213@gmail.com
摘要:本文阐述了Windows Mobile 平台下EDB 数据库的基本知识和常用的操作函数及数据结构体,在此基础上结合Mobile 系统自身的联系人(contacts)数据库实例,系统介绍了EDB 数据库的创建思路和具体操作,如读取记录、添加记录、删除和查询记录等。另外还深入介绍了EDB 的事务操作和监控EDB 数据库变化的通知机制。
关键词:智能手机,Windows Mobile,EDB,系统联系人
1. 引言
近年来,随着人们对移动办公和娱乐需求的不断提高,传统的以通讯功能为主的手机已经不能适应人们的需求。正是在这种情况下,类似当前PC 的具备通用操作系统的智能手机也就应运而生,这些智能手机的一大特点便是其操作系统不再是各个厂家根据自己的硬件产
品专门定制,而是采用类似PC 上的Windows 操作系统一样通用的操作系统,该系统的接口对外公开,可以由第三方开发者开发该系统应用,这样配合手机硬件水平的不断提高,使得手机的应用领域大大拓展。随着软硬件性能的提升,智能手机已经不仅仅是一个手机通讯工具,而成为了用户的个人数据和移动办公中心。基于智能手机平台的应用,需要处理大量的用户个人数据和应用数据,因此必需提供数据存储、数据管理和查询的功能,同时对于数据的安全性和完整性也必须提供支持。此外,智能手机设备还可以作为后台信息系统的信息收集、处理和接收终端[1]。
2. 背景
2.1. 智能手机简介
目前市场上出现的智能手机操作系统主要为 Symbian、Windows Mobile、Palm OS 以及Linux 等几种。Windows Mobile(以下简称WM)是在Windows CE 系统基础上为智能移动终端设备设计的操作系统。基于WM 操作系统的智能终端设备分为Smartphone 和Pocket PC 两个大类。其中Smartphone 从外观设计、使用习惯方面来看,其更像一部电话,同时具备一定的数据管理和处理能力。而Pocket PC 的功能更类似于一部个人电脑,有非常强大的数据管理和处理功能,同时Pocket PC 也加入了电话功能,使其成为新的Pocket PC phone[2] 。
2.2. EDB 数据库简介
WM 5.0 以前的系统使用的是CEDB 数据库,EDB 是WM 5.0 中的新特性之一。为了改善应用程序的性能和长期可移植性,CEDB 已经被 EDB 所取代。EDB 是一个基于SQL Server CE 的嵌入式数据库引擎,为基于Windows CE 的应用程序提供核心功能。通过使用EDB,开发者能够创建一个对象存储,称为数据库卷(volume),其中可以包含多个数据库。该数据库卷是基于文件的,因此可以很容易被复制和移动[3]。
EDB 作为CEDB 的更新和增强版本,还支持 事务(transaction) 多用户同时访问
支持 stream 类型的数据 多种排序方式,多个主属性
增强的性能,尤其是较大的数据库
3. EDB 数据库设计
在 WM 系统中,系统联系人和SIM 卡联系人数据,是以EDB 形式存储的。因此本文结合WM 系统联系人数据库的实际例子,详细介绍EDB 数据库的设计与应用开发。
3.1. EDB 基本概念
Volume(数据库卷):用来存储数据库的文件,一个volume 上可以创建多个数据库。例如WM 系统的"\\pim.vol",是用来存储个人信息的卷文件,里面有系统联系人、通话记录、任务、约会等多个数据库。 Database(数据库):每个数据库即一个表。数据库存储在volume 文件内。其中,WM系统的"\\pim.vol"卷文件中,联系人数据库的名字为"Contacts Database"。 Property ID(属性ID):每个数据库包含多个属性,即表的多个字段。属性ID 不仅代表该属性的名字,同时也指定了该属性的数据存储类型(int、string、time……)。 CEOID(对象ID):DWORD 类型,用来代表一个数据库或者数据库中每条记录的唯
一ID 标识。可以理解为数据库中每条记录存放的位置或者索引。 CEGUID:Globally Unique Identifier(全球唯一标识符),它是一个128 比特(16 字节)的结构。用来标识一个被加载的数据库卷。CEGUID 和CEOID 一起,唯一标识一条记录,或者唯一标识一个数据库。
EDB 数据库的常用操作步骤为:首先加载一个数据库卷文件,然后打开卷文件中的某个数据库,获取数据库的句柄。此后通过这个打开的数据库句柄,对数据库中的记录进行读写、删除、更新、查找的操作。最后关闭数据库,卸载之前加载的卷文件,结束操作[4]。
3.2. EDB 常用操作函数
EDB 提供了丰富的操作API,来支持各种数据库应用。下面列举出一些最常用的API,读者可以通过WM SDK 帮助文档或者MSDN,详细了解这些API 的参数说明和注意事项,同时可以获取更多的EDB 相关API[5]。
加载或者创建一个数据库卷文件
BOOL CeMountDBVolEx(PCEGUID pGuid, LPWSTR lpwszDBVol,
CEVOLUMEOPTIONS* pOptions, DWORD dwFlags );
卸载数据库卷文件
BOOL CeUnmountDBVol( PCEGUID pGuid);
打开一个数据库
HANDLE CeOpenDatabaseInSession(HANDLE hSession, PCEGUID pGuid, PCEOID poid,
LPWSTR lpwszName, CESORTORDERSPEC* pSort, DWORD dwFlags,
CENOTIFYREQUEST* pRequest);
新建一个数据库
CEOID CeCreateDatabaseWithProps( PCEGUID pGuid, CEDBASEINFOEX* pInfo,
DWORD cProps, CEPROPSPEC* prgProps);
创建或者更新一条数据记录
CEOID CeWriteRecordProps( HANDLE hDatabase, CEOID oidRecord,
WORD cPropID, CEPROPVAL* prgPropVal );
读取一条数据记录
CEOID CeReadRecordPropsEx( HANDLE hDatabase, DWORD dwFlags, LPWORD
lpcPropID, CEPROPID* prgPropID, LPBYTE lplpBuffer, LPDWORD
lpcbBuffer, HANDLE hHeap);
查找一条记录
CEOID CeSeekDatabaseEx(HANDLE hDatabase, DWORD dwSeekType, DWORD
dwValue, WORD wNumVals, LPDWORD lpdwIndex);
删除一条记录
BOOL CeDeleteRecord( HANDLE hDatabase, CEOID oidRecord );
创建一个 session。一个session 用来开始、提交、回滚事务。
HANDLE CeCreateSession( CEGUID* pGuid );
开始一个事务
BOOL CeBeginTransaction( HANDLE hSession, CEISOLATIONLEVEL isoLevel); 提交一个事务
BOOL CeEndTransaction( HANDLE hSession, BOOL fCommit);
3.3. 创建和打开数据库
3.3.1. 打开系统联系人数据库
第一步,首先加载WM 系统联系人数据库所在的卷文件"\\pim.vol",得到该卷文件的CEGUID。调用方式如下:
CEGUID g_ceGuidInitDB; // 存储加载的卷文件"\\pim.vol"的GUID
if(FALSE == CeMountDBVolEx(&g_ceGuidInitDB, L"\\pim.vol", 0, OPEN_ALWAYS ))
{
DWORD error = GetLastError();
}
如果是需要创建一个新的卷文件,只要把第四个dwFlags 参数设为CREATE_NEW 或者
CREATE_ALWAYS,然后指定卷文件的绝对路径名就可以了。
第二步,打开系统联系人数据库"Contacts Database"
HANDLE g_hContactDB; // 数据库句柄
CEOID oidContact = 0; // 数据库的CEOID
g_hContactsDB = CeOpenDatabaseInSession(NULL, &g_ceGuidInitDB, &oidContact,
L"Contacts DataBase", NULL, CEDB_AUTOINCREMENT, NULL);
if( INVALID_HANDLE_VALUE == g_hContactDB )
{
DWORD error = GetLastError();
}
其中, 第六个参数为CEDB_AUTOINCREMENT 标志, 指示每调用一次
CeReadRecordPropsEx 读取记录,数据库中的当前指针位置会自动增加到下一条记录。也可以把该参数设为0。
如果成功打开了联系人数据库,返回数据库句柄g_hContactsDB,并且得到的oidContact值为数据库的CEOID。
3.3.2. 创建新的数据库
假设某个特定应用,需要对系统联系人进行分组,分组包括"亲人"、"同学"、"朋友"、"商务"等等。则需要创建一个新数据库"ContactsGroupDB",用来存储每个联系人的姓名、电话号码、所属分组。创建该数据库步骤如下:
第一步,定义各个属性的 PropID
const CEPROPID GroupIDPropid = MAKELONG(CEVT_UI4, 0); // 分组ID,无符号整型
const CEPROPID NamePropid = MAKELONG(CEVT_LPWSTR,1); // 姓名,string 类型
const CEPROPID PhoneNumberPropid = MAKELONG(CEVT_LPWSTR,2); // 电话号码,string
第二步,填充数据库信息结构CEDBASEINFOEX 和数据库属性结构CEPROPSPEC
DWORD wProps = 3; // 数据库有三个属性
CEPROPSPEC propSpec[3];
memset(propSpec,0,sizeof(CEPROPSPEC)*wProps);
propSpec[0].wVersion = 1;
propSpec[0].propid = GroupIDPropid;
propSpec[0].dwFlags = DB_PROP_NOTNULL; // 分组ID,不能为空
propSpec[1].wVersion = 1;
propSpec[1].propid = NamePropid; // 联系人名字,可以为空
propSpec[2].wVersion = 1;
propSpec[2].propid = PhonePropid;
propSpec[2].dwFlags = DB_PROP_NOTNULL; // 联系人号码,不能为空
// 填充数据库信息结构
CEDBASEINFOEX ced;
memset(&ced, 0, sizeof(CEDBASEINFOEX));
ced.wVersion = CEDBASEINFOEX_VERSION;
ced.dwSize = sizeof(CEDBASEINFOEX);
ced.dwFlags = CEDB_VALIDNAME | CEDB_VALIDSORTSPEC;
// CEDB_VALIDNAME 数据库的名字有效
// CEDB_VALIDSORTSPEC 数据库排序有效
wcsncpy(ced.szDbaseName, L"ContactsGroupDB", CEDB_MAXDBASENAMELEN);
第三步,在上节加载的"\\pim.vol"卷上新建"ContactsGroupDB"数据库
CEOID oid = CeCreateDatabaseWithProps(&g_ceGuidInitDB, &ced, wProps, propSpec);
if( 0==oid )
{
DWORD error = GetLastError();
}
3.4. 数据库操作
3.4.1. 读取记录
根据对系统联系人 EDB 数据库记录的分析,可以得到各个属性的属性PropID,下面列举一部分属性ID。读者可以根据读取到的联系人属性记录值,推导出每个联系人属性相应的PropID。
const DWORD ContactNamePropid = 0x0080001f; // 名 const DWORD ContactSurNamePropid = 0x0084001f; // 姓 const DWORD ContactPhonePropid= 0x0096001f; // 移动电话
const DWORD ContactHomePhonePropid = 0x0099001f; // 家庭电话
const DWORD ContactHomePhone2Propid = 0x009a001f; // 家庭电话2
const DWORD ContactWorkPhonePropid = 0x0097001f; // 工作电话
const DWORD ContactWorkPhone2Propid = 0x0098001f; // 工作电话2
通过前文打开的联系人数据库句柄g_hContactsDB,并且也已经知道了各个属性的
PropID,就可以开始对联系人进行读取了。下面的代码片断,实现读取全部联系人的功能。
// 首先把数据库位置定位到第一条记录。
CEOID oid = CeSeekDatabaseEx(g_hContactsDB,CEDB_SEEK_BEGINNING ,0,0,NULL);
while(oid) // 如果联系人记录存在
{
PCEPROPVAL pRecord = NULL; // 存储记录属性的数据结构指针
PBYTE pStringStore = NULL; // 系统分配的属性存储的内存空间地址
DWORD dwRecSize; // 内存空间的大小
WORD wProps; // 读取到的联系人属性的数量
oid = CeReadRecordPropsEx (g_hContactsDB, CEDB_ALLOWREALLOC,&wProps,
NULL,&(LPBYTE)pStringStore, &dwRecSize, NULL);
if(0!=oid) // 读取成功
{
pRecord = (PCEPROPVAL)pStringStore;
for(int i = 0; i 删除添加记录
如果要从数据库中删除一个联系人,只需要获得该联系人记录的CEOID,然后通过调
用CeDeleteRecord 函数删除。下面代码片断功能为删除数据库从前往后的第5 条记录。
// 首先把数据库位置定位到从前往后的第五条记录。
CEOID oid = CeSeekDatabaseEx(g_hContactsDB,CEDB_SEEK_BEGINNING ,4,0,NULL);
if(oid)
{
If(FALSE == CeDeleteRecord(g_hContactsDB, oid)) // 删除该条记录
{
DWORD error = GetLastError();
}
}
向数据库 中添加一个联系人, 需要先填充属性结构CEPROPVAL , 然后调用
CeWriteRecordProps 添加。该函数也可以用来修改某个已经存在的记录的属性值。下面的代
码添加一个联系人。
// 首先填充CEPROPVAL 属性结构
CEPROPVAL propVal[3];
WORD wProps = 3;
memset(propVal,0,sizeof(CEPROPVAL)*3);
propVal[0].propid = ContactSurNamePropid;
propVal[0].val.lpwstr = L"张"; // 姓
propVal[1].propid = ContactNamePropid;
propVal[1].val.lpwstr = L"小军"; // 名 propVal[2].propid = ContactPhonePropid; propVal[2].val.lpwstr = L"13812345678"; // 移动电话
// 创建一条记录,并且把属性写入记录。第二个参数CEOID 为0,表示新建一条记录。
CEOID oidRecord = CeWriteRecordProps(g_hContactsDB, 0, wProps, propVal);
if(oidRecord != 0) // 成功,则返回记录的CEOID
{
DWORD error = GetLastError();
}
也可以修改某个指定记录的属性值,例如下面的代码片断,把上面创建的联系人记录的电话号码修改为"13800000000"。
CEPROPVAL propVal[1];
WORD wProps = 1;
propVal[0].propid = ContactPhonePropid;
propVal[0].val.lpwstr = L"13800000000";
// 根据上文得到的oidRecord,修改该条记录
CEOID oid = CeWriteRecordProps(g_hContactsDB, oidRecord, wProps, propVal);
If(oid != oidRecord) // 如果成功,则返回的oid 等于当前修改记录的oidRecord
{
DWORD error = GetLastError();
}
3.4.3. 查找记录
EDB 数据库支持多种查找方式,比如指定位置查找,指定条件查找等。数据库记录的
查找,是通过CeSeekDatabaseEx 来实现。CeSeekDatabaseEx 函数的dwSeekType 参数指定查
找的方式,下面列举出常用的几种查找方式[3]。
直接查找指定位置的记录(CEDB_SEEK_CEOID) 从开始位置查找(CEDB_SEEK_BEGINNING) 从最后位置查找(CEDB_SEEK_END) 从当前位置查找(CEDB_SEEK_CURRENT) 查找第一条属性等于指定值的记录(CEDB_SEEK_VALUEFIRSTEQUAL) 查找下一条属性等于指定值的记录(CEDB_SEEK_VALUENEXTEQUAL) 查找小于指定属性值的记录(CEDB_SEEK_VALUESMALLER) 查找小于等于指定属性值的记录( CEDB_SEEK_VALUESMALLEROREQUAL) 查找大于指定属性值的记录(CEDB_SEEK_VALUEGREATER) 查找大于或者等于指定属性值的记录( CEDB_SEEK_VALUEGREATEROREQUAL)
3.4.4.
结束数据库操作
结束数据库操作,需要关闭打开的数据库句柄,然后卸载数据库卷文件。
if( INVALID_HANDLE_VALUE != g_hContactsDB )
{
CloseHandle(g_hContactsDB,); // 关闭打开的数据库
g_hContactsDB = INVALID_HANDLE_VALUE;
CeUnmountDBVol(&g_ceGuidInitDB); // 卸载数据库卷
}
3.5. 数据库事务
EDB 支持事务,通过事务,把一系列的数据库修改操作,形成一个单一的原子操作,这些操作要么全部执行提交,要么全部回滚,从而保证了数据的完整性和一致性[3]。
EDB 事务操作的基本步骤为:
第一步,创建一个 session
HANDLE g_hSession = CeCreateSession(&g_ceGuidInitDB); // g_ceGuidInitDB 为上文中加载的系统联人数据库所在的卷文件的CEGUID
第二步,打开数据库,指定数据库的session。注意第一个参数设为创建的g_hSession。HANDLE g_hContactDB;
CEOID oidContact = 0;
g_hContactsDB = CeOpenDatabaseInSession(g_hSession, &g_ceGuidInitDB, &oidContact,L"Contacts DataBase", NULL, CEDB_AUTOINCREMENT, NULL);
第三步,开始一个事务
CeBeginTransaction(g_hSession,CEDB_ISOLEVEL_DEFAUL T );
然后,对用g_hSession 打开的数据库g_hContactsDB 进行一些数据库更改操作。
第四步,提交事务。
CeEndTransaction(g_hSession,TRUE); // 第二个参数为true,提交从begin 到end 之间的所有操作。
CeEndTransaction(g_hSession,FALSE); // 第二个参数为false,回滚从begin 到end 之间的所有操作。
EDB 支持在同一个事务中的多个数据库的操作,但是要求这些数据库都在同一个卷文
件中。例如,在联系人数据库所在的卷文件中,还有一个通话记录数据库"Clog.db"。如果打开该数据库时也指定了g_hSession,则联系人数据库和通话记录数据库的操作就可以处于同一个Transaction。
HANDLE g_hClogDB;
CEOID oidContact = 0;
g_hClogDB = CeOpenDatabaseInSession(g_hSession, &g_ceGuidInitDB, &oidContact,
L"Clog.db", NULL, CEDB_AUTOINCREMENT, NULL);
最后,结束操作退出的时候,还需要关闭创建的session CloseHandle(g_hSession); 3.6. 数据库通知机制
EDB 提供了数据库的变更通知机制,使得应用程序可以监控数据库的变化,响应相关的变化,从而实现特定的需求[3]。
首先,打开数据库的时候,要请求获取数据库的通知消息,填充CENOTIFYREQUEST结构,指定通知消息接受的窗口。代码片断如下:
假设,hWnd 为一个已经存在的窗口句柄。
CENOTIFYREQUEST edbContactsRequest;
edbContactsRequest.hwnd = hWnd;
edbContactsRequest.dwFlags = CEDB_EXNOTIFICATION;
edbContactsRequest.dwSize = sizeof(CENOTIFYREQUEST);
edbContactsRequest.hHeap = NULL;
// 打开联系人数据库,把最后一个参数设为edbContactsRequest 的地址
CEOID oidContact;
m_hGroupContactDB = CeOpenDatabaseInSession(NULL, &m_ceGuidGroupDB,
&oidContact, L("Contacts DataBase"), NULL, 0, &edbContactsRequest);
if(INVALID_HANDLE_VALUE == g_hContactDB)
{
DWORD error = GetLastError();
}
成功打开联系人数据库之后,联系人数据库的所有变化消息,都会发送给 hWnd 窗口。在hWnd 的窗口处理函数中,处理WM_DBNOTIFICATION 消息。假设处理hWnd 处理该消息的函数如下:
LRESULT OnContactDBNotification(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
CENOTIFICATION * pCalllogNotification = (CENOTIFICATION*)(lParam);
CEGUID guidContactVol = pCalllogNotification->guid; // 获得数据库卷的CEGUID
CEOID dbOid = pCalllogNotification-> oidParent; // 获得记录所在的数据库OID
CEOID oid = pCalllogNotification->oid; // 获得发生变化的记录OID
switch ( pCalllogNotification->uType )
{
case DB_NOTIFY_RECORD_CREATED: // 新建了一个联系人记录
{
// 在这里,通过获得的记录oid,可以读取新建联系人的姓名、号码等属性
// 处理完之后,需要释放消息
CeFreeNotification(&edbContactsRequest, pCalllogNotification);
break;
}
case DB_NOTIFY_RECORD_CHANGED: // 修改了一条记录
case DB_NOTIFY_RECORD_DELETED: // 删除了一条记录
default:
// 处理完之后,需要释放消息
CeFreeNotification(&edbContactsRequest, pCalllogNotification);
Break;
}
return S_OK;
}
4. 结束语
通过上面的实例介绍, 读者可以初步掌握数据库的常用操作技术, 能够根据需要对数据库进行开发应用。数据库开发是比较复杂的问题,要开发使用功能强大、性能稳定的数据库, 需要掌握的知识很多。特别是对数据库进行操作时由于函数参数较多往往嵌套多个结构体, 而且比较复杂, 涉及到很多的结构体和指针变量, 在写代码时要特别注意指针和内存的问题, 要防止内存泄露,指针要及时进行清空。希望本文能对WM 平台的EDB 数据库开发起到抛砖引玉的作用。
参考文献
[1] 傅曦,齐宇,徐骏.Windows Mobile 手机应用开发[M]. 北京:人民邮电出版社,2005
[2] 刘彦博,胡砚,马骐.Windows Mobile平台应用与开发[M]. 北京:人民邮电出版社,2006
[3] Microsoft.MSDN Mobile 专区[OL]. http://msdn.microsoft.com/en-us/windowsmobile/defa ult.aspx,2006
[4] 田东风.Windows CE 应用程序设计[M].北京:机械工业出版社,2005
[5] 沈建国,田增山.Windows CE 5.0 EDB数据库的应用与开发[D].北京:电脑编程技巧与维护,2007.10
Windows Mobile Platform EDB Database
Application Develop
Cheng Lehu1, Zou Shihong1, Linyu2, Shi Wenyong2
1. State Key Lab of Networking and Switching Technology,
Beijing University of Posts and Telecommunications, Beijing (100876)
2. Beijing NetQin Tech. Co., Ltd., Beijing (100013)
Abstract
This paper first introduced the basic knowledge of Windows Mobile platform's EDB database, and
common data structure and EDB API. Then, based on Windows Mobile's own Contacts EDB database instance, explain how to develop EDB application, such as create EDB database, reading records, add records, delete records and seek records. This paper also introduced EDB transaction and EDB database notification mechanism in detail. Keywords: Mobile Application, Windows Mobile, EDB, Contacts 作者简介:程乐乎,男,1984年生,硕士研究生,主要研究方向是Windows Mobile 操作系统及其应用编程。
发表评论
-
Windows消息机制VC
2012-01-20 01:53 837Windows消息机制VC 2011年0 ... -
Windows窗口和消息(2)
2012-01-20 01:53 764Windows窗口和消息(2) 2011 ... -
开始Windows Embedded Compact 7的第一个项目――虚拟机上的CEPC
2012-01-20 01:53 598开始Windows Embedded Compact ... -
时间非线性
2012-01-19 09:39 598时间非线性 2011年12月31 ... -
那些年
2012-01-19 09:39 651那些年 2012年01月14日 大概是在小学五年级的时 ... -
家有女儿初长成系列作文(五年级下)
2012-01-19 09:39 648家有女儿初长成系列作文(五年级下) 2012年01月06日 ... -
第十一册第八组习作范文引路:“我的学艺之路”章法导写
2012-01-19 09:39 982第十一册第八组习作范 ... -
儿子考完试以后
2012-01-19 09:39 677儿子考完试以后 2012年0 ... -
【精】【爆】MTK手机安装软件游戏大全!新人必看
2012-01-17 02:14 1319【精】【爆】MTK手机安装软件游戏大全!新人必看 2011年 ... -
3G手机J2ME开发环境搭建(eclipse3开发j2me环境搭建)
2012-01-17 02:14 6503G手机J2ME开发环境搭建( ... -
基于Windows CE的激光切割机开放式数控系统的研究
2012-01-17 02:14 660基于Windows CE的激光切割 ... -
内存绘图
2012-01-17 02:14 665内存绘图 2010年10月07日 经常出现图形闪烁的 ... -
Flex 86道题(好好学习一下)
2012-01-17 02:14 611Flex 86道题(好好学习一 ... -
★C语言第十部分!
2012-01-15 21:48 568★C语言第十部分! 2009年12月07日 【例12. ... -
C语法基础之文件操作
2012-01-15 21:48 557C语法基础之文件操作 2009年10月18日 文件 ... -
嵌入式研发工程师面试试题
2012-01-15 21:48 866嵌入式研发工程师面试试题 2010年04月22日 一、A ... -
C语言程序设计的一些基本问题
2012-01-15 21:48 884C语言程序设计的一些基本问题 2010年11月11日 c ...
相关推荐
Windows Mobile 平台 EDB 数据库的 应用与开发
edb数据库转Excel模块edb数据库转Excel模块edb数据库转Excel模块edb数据库转Excel模块
易语言操作数据库教程之EDB教程第一讲。第一讲:。1.数据库有哪些?。单机: ACCESS SQLITE EDB QE(内存操作的数据库)。网络: MySQL PHP+MySQL 。2.EDB的优势。1.EDB 他是易语言自带的数据库格式。2.EDB 便于操作。3....
可对edb数据库进行简单修改创建,修改密码等操作
EDB数据库编辑器,专门编辑edb数据库的。
文章中阐述了WinCE5.0 EDB数据库的基本构建过程和常用的操作函数及结构体,通过实例介绍了EDB数据库的创建思路和具体操作
EDB数据库客户端模块 1.0.rar EDB数据库客户端模块 1.0.rar EDB数据库客户端模块 1.0.rar EDB数据库客户端模块 1.0.rar EDB数据库客户端模块 1.0.rar EDB数据库客户端模块 1.0.rar
EDB数据库登陆验证
程序使用易语言外部数据库组件实现EXCEL到EDB的导入。@易语言源码大全。
易语言模块易语言EDB数据库客户端.rar 易语言模块易语言EDB数据库客户端.rar 易语言模块易语言EDB数据库客户端.rar 易语言模块易语言EDB数据库客户端.rar 易语言模块易语言EDB数据库客户端.rar 易语言模块...
最近学数据库,为了对比各个数据库的性能就都写了一遍,分别用易语言自带EDB数据库,Access2003的MDB数据库和网络上免费的MYSQL数据库写了个人记账软件,总体对比来说,各有所长~!。1.MYsql是基于网络服务器的,...
易语言模块edb数据库转Excel模块 1.3.rar 易语言模块edb数据库转Excel模块 1.3.rar 易语言模块edb数据库转Excel模块 1.3.rar 易语言模块edb数据库转Excel模块 1.3.rar 易语言模块edb数据库转Excel模块 1.3.rar ...
易语言树型框读出EDB数据库源码,树型框读出EDB数据库,子程序1,查找相同文本
易语言EDB数据库登陆验证修改添加用户源码,EDB数据库登陆验证修改添加用户
易语言模块EDB数据库客户端模块 1.0.rar 易语言模块EDB数据库客户端模块 1.0.rar 易语言模块EDB数据库客户端模块 1.0.rar 易语言模块EDB数据库客户端模块 1.0.rar 易语言模块EDB数据库客户端模块 1.0.rar ...
易语言EDB数据库优化源码,EDB数据库优化
完整版易语言EDB数据库客户端.rar
易语言EXCEL表导入EDB数据库源码,EXCEL表导入EDB数据库,是否存在指定数据表,转换字母,随机生成密码