嵌入式SQL数据库编程.docx
《嵌入式SQL数据库编程.docx》由会员分享,可在线阅读,更多相关《嵌入式SQL数据库编程.docx(16页珍藏版)》请在冰豆网上搜索。
嵌入式SQL数据库编程
实验五嵌入式SQL数据库编程
[实验目的]
1、了解ADOCE组件;
2、掌握在Windows下的DLL等组件的注册;
3、掌握嵌入式数据库的开发过程;
4、掌握SQL语句的使用方法
5、熟悉EVC和VS.Net的使开发环境;
[实验仪器]
1、装有PlatformBuilder、EVC和VS.Net开发平台的PC机一台
2、XSBase270实验开发平台一套
[实验原理]
1、ADOCE简介
ADO是Microsoft公司为各类型数据所提供的一个策略性的高级界面。
使用ADO的应用程序可以通过OLE数据库提供者存取和操作数据库服务器中的数据。
ADO主要的好处是容易使用、高速、占用内存少及占用磁盘空间小。
ADO提供一致高效的数据存取,用以建立前端数据库客户端或是建立应用程序、工具甚至是Internet浏览器的中间层商业对象。
ADO是MicrosoftUniversalDataAccess关键组件。
UniversalDataAccess提供对各种信息来源的高效存取,包括关系型和非关系型的数据源以及一个容易使用的程序化界面。
该界面不但独立于开发工具,也不限定使用哪一种程序语言。
这些技术使得公司能够综合不同的数据源,建立容易维护的解决方案并选择使用最好的工具、应用程序和应用平台。
ADOCE提供ADO对WindowsCE操作系统的子集合,这个子集合包括对Recordset对象和Field对象的支持。
ADOCE对WindowsCE来说增加了新的数据库功能,可以存取保存在本机中的数据库并且提供网络数据库的数据同步。
ADOCE在任何COM-capable环境下都提供对WindowsCE数据库引擎的存取。
ADOCE提供了ADOCE.Connetion对象,用来创建和存取数据库、数据表。
ADOCE还提供了一个Errors对象,它用来代表各类运行中产生的错误。
此外,ADOCE提供的名为ADOCE.Recordset的对象,用来表示从实际数据库、数据表里提取组合而成的虚拟记录集。
在ADOCE.Recordset对象中含有很多的方法与属性,它们主要用于管理已经获得的记录集合,此外它还含有一个Field对象,用于表示字段。
1.1Connection对象:
Connection对象的方法共有7种,如表5.1所示。
表5.1Connection对象的方法
方法
描述
BeginTrans
在目前的数据库连接上建立一个新的事务(transaction)
Close
关闭正在使用的数据库连接,同时中断与实际数据库间的沟通渠道
CommmitTrans
将目前事务的内容写入
Open
打开与实际数据源间渠道沟通
OpenSchema
从数据源的提供者处获取关于数据库的schema信息
Execute
执行一个不会返回记录集的命令
RollbackTran
取消当前的事务
1.2Recordset对象:
Recordset对象的方法共有17种,如表5.2
表5.2Recordset对象方法
方法
描述
Open
用来取得虚拟记录集.执行SQL语句
Close
关闭虚拟记录集
Move
移动指向虚拟记录集记录的指针
MoveFirst
将指向虚拟记录集记录的指针移到第一笔的位置
MoveLast
将指向虚拟记录集记录的指针移到最后一笔的位置
MoveNext
将指向虚拟记录集记录的指针移到目前位置的下一笔
MovePrevious
将指向虚拟记录集记录的指针移到目前位置的前一笔
Supports
判断虚拟记录集是否支持某些特性
AddNew
针对目前的虚拟记录集新建一笔记录
Delete
从目前的虚拟记录集中删除一笔记录
Update
将虚拟记录集中被更新的记录写入数据库
CancelUpdate
取消保留在内存中关于记录的修改
Requery
以数据源更新虚拟记录集的内容tfromthedata
Find
返回符合特定条件的虚拟记录集
Seek
从建有索引的虚拟记录集中查找一笔记录,并将记录指针指向该记录使之成为当前的记录
clone
复制一份虚拟记录集
1.3Field对象:
Field对象是组成数据表的最基本组件。
Field对象的方法共有2种,如表5.3所示
表5.3Field对象的方法
方法
描述
AppendChunk
在一个二进制数据或大量文字数据的字段中新建数据
GetChunk
取得全部或部分二进制数据或大量文字数据
2、SQL简介
SQL是一种专门用来处理关系型数据库的语句(statement),也有人将SQL称作是第4代程序语言,它是StructuredQueryLanguage3个单词的缩写。
主要功能包括:
(1)定义、创建和修改数据库及数据表
(2)新增、删除、修改、查询实际数据表中的记录的功能
(3)保持数据库的安全性与数据的整合性
SQL语句分成两种:
DDL与DML。
DDL是DataDefinitionLanguage(数据定义语言)的缩写,它支持上述第1项功能,而DML是DataManipulationLanguage(数据操作语言)的缩写,它支持上述第2项功能。
ADOCE目前支持的DDL如表5.4所示,ADOCE目前支持的DDL如表5.5所示,所有的DML语句支持Where条件。
表5.4ADOCE控件支持的DDL语句
DDL语句
描述
CreateDatabase
创建新的数据库文件
CreateTable
在数据库文件中创建新的数据表
AlterTable
修改现存数据表的结构
CreateIndex
根据数据表的字段建立索引
DropDatabase
删除数据库
DropTable
删除数据表o
DropIndex
删除索引
表5.5ADOCE控件支持的DML语句
DML语句
描述
Select
查询数据表中记录
Delete
删除数据表中记录
Insert
向数据表中新增一条记录
Update
修改更新数据表记录
3ADOCE编程实现
3.1注册ADOCE的DLL组件
ADOCE属于标准的COM组件,采用动态连接库的形式进行发布,在使用ADOCE进行数据编程,必须对ADOCE的动态连接库下载到目标板,并利用REGSVRCE.EXE对部分需要注册的DLL组件进行注册。
ADOCE需要的组件如表5.6
表5.6ADOCE控件的DLL组件
组件名称
是否需要注册
Adoce31.dll
是
Adoxce31.dll
是
Adocedb31.dll
否
Adoceoledb31.dll
否
Msdaer.dll
是
Msdaeren.dll
否
msdadc.dll
是
msdaosp.dll
否
用户可以将上述DLL组件下载到目标板,然后利用REGSVRCE.EXE命令对它们进行注册。
本实验程序在运行时自动将上述DLL组件下载到目标板的WinCE操作系统的\windows目录中,然后利用CreateProcess函数运行REGSVRCE.EX命令对DLL组件进行注册。
BOOLCdatabaseDlg:
:
RegisterDLL(void)
{
BOOLok1,ok2,ok3,ok4,ok5,ok6,ok7,ok8;
ok1=ok2=ok3=ok4=ok5=ok6=ok7=ok8=FALSE;
//1.注册DLL
ok1=CreateProcess(_T("\RegSvrCe"),_T("/s\Windows\\adoce31.dll"),
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
ok2=CreateProcess(_T("\RegSvrCe"),_T("/s\Windows\\Adoxce31.dll"),
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
ok3=CreateProcess(_T("\RegSvrCe"),_T("/s\Windows\\Adocedb31.dll"),
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
ok4=CreateProcess(_T("\RegSvrCe"),_T("/s\Windows\\Adoceoledb31.dll"),
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
ok5=CreateProcess(_T("\RegSvrCe"),_T("/s\Windows\\Msdaer.dll"),
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
ok6=CreateProcess(_T("\RegSvrCe"),_T("/s\Windows\\Msdaeren.dll"),
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
ok7=CreateProcess(_T("\RegSvrCe"),_T("/s\Windows\\msdadc.dll"),
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
ok8=CreateProcess(_T("\RegSvrCe"),_T("/s\Windows\\msdaosp.dll"),
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
if(!
(ok1&&ok2&&ok3&&ok4&&ok5&&ok6&&ok7&&ok8))
returnFALSE;
else
returnTRUE;
}
3.2ADOCE的初始化步骤:
由于ADOCE属于标准的COM组件,必须初始化一个COM,然后再进行ADO数据源连接的相关编程,具体实现过程如下:
BOOLCdatabaseDlg:
:
CreateConnection(void)
{
CLSIDtClsid;
HRESULThr;
//0初始化COM库
hr=CoInitializeEx(NULL,COINIT_MULTITHREADED);//初始化COM库
if(FAILED(hr))
{
MessageBox(_T("初始化COM库失败!
"),_T("系统信息"),MB_OK|MB_ICONINFORMATION);
returnFALSE;
}
//1,得到ADO连接对象对应ClassID
hr=CLSIDFromProgID(g_szADOCE31ConnProgID,&tClsid);
if(FAILED(hr))
returnFALSE;
//2,创建ADO连接对象
hr=CoCreateInstance(tClsid,NULL,
CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER,
IID__Connection,(LPVOID*)&m_pADOCEConn);
if((!
m_pADOCEConn)||FAILED(hr))
returnFALSE;
//3.设置连接数据库的Provider
hr=m_pADOCEConn->put_Provider(TEXT("cedb"));
ifFAILED(hr)
returnFALSE;
//4.得到记录集对象的ClassID
hr=CLSIDFromProgID(g_szADOCE31RSProgID,&tClsid);
ifFAILED(hr)
returnFALSE;
//5.创建结果集对象
hr=CoCreateInstance(tClsid,NULL,CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER,
IID__Recordset,(LPVOID*)&m_pADOCERS);
if((!
m_pADOCERS)||FAILED(hr))
returnFALSE;
returnTRUE;
}
3.3ADOCE的编程实现
ADOCE进行数据库编程基本上属于对SQL语句的执行,下面分别对建立数据库、打开数据库、建立数据表以及增加数据记录的编程进行分析。
(1)执行SQL的函数:
BOOLCdatabaseDlg:
:
ExecSql(CStringstrSql,BOOLView)
{
HRESULThr;
VARIANTvarStrSql,varEmpty;
VariantInit(&varStrSql);//初始化VARIANT变量
VariantInit(&varEmpty);;
varStrSql.bstrVal=SysAllocString(strSql);
varStrSql.vt=VT_BSTR;//定义字符串
hr=m_pADOCERS->Open(varStrSql,varEmpty,MSADOCE:
:
adOpenDynamic,
MSADOCE:
:
adLockOptimistic,MSADOCE:
:
adCmdText);
SysFreeString(varStrSql.bstrVal);
if(FAILED(hr))
returnFALSE;
if(View)
{
longiCount=0;
hr=m_pADOCERS->get_RecordCount(&iCount);
if(iCount>0)
AddRecordToView();
}
m_pADOCERS->Close();
returnTRUE;
}
(2)利用“CREATEDATABASE数据库名”建立数据库
BOOLCdatabaseDlg:
:
CreateDatabase(LPCTSTRszDbName)
{
CStringstrSql;
strSql.Format(_T("CREATEDATABASE'%s'"),szDbName);
if(!
ExecSql(strSql))
returnFALSE;
else
returnTRUE;
}
(3)利用CREATETABLE建立数据表
voidCdatabaseDlg:
:
OnBnClickedbtncreatetabe()
{
CStringm_strSql;
m_strSql="CREATETABLEstudent(StuIDvarchar(20),Namevarchar(20),ageint,classvarchar(10))";
if(!
ExecSql(m_strSql))
MessageBox(_T("建立数据表失败!
"),_T("系统信息"),MB_OK|MB_ICONINFORMATION);
else
MessageBox(_T("建立数据表成功!
"),_T("系统信息"),MB_OK|MB_ICONINFORMATION);
}
(4)打开数据库函数
BOOLCdatabaseDlg:
:
OpenDatabase(LPCTSTRszDbName)
{
HRESULThr;
VARIANTvarConn1;
//与指定的数据库建立连接
hr=m_pADOCEConn->Open(LPTSTR(szDbName),TEXT(""),TEXT(""),MSADOCE:
:
adOpenUnspecified);
ifFAILED(hr)
returnFALSE;
VariantInit(&varConn1);
varConn1.pdispVal=m_pADOCEConn;
varConn1.vt=VT_DISPATCH;
//设置结果集对象到已建立的连接上
hr=m_pADOCERS->put_ActiveConnection(varConn1);
if(FAILED(hr))
returnFALSE;
returnTRUE;
}
(5)增加数据记录
voidCdatabaseDlg:
:
OnBnClickedbtnaddrecord()
{CAddRecordsetDlgdlg(_T("增加记录"));
if(dlg.DoModal()==IDOK)
{
HRESULThr;
CStringm_strSql,strValue;
VARIANTvarStrSql,varEmpty,varFieldValue;
VariantInit(&varStrSql);
VariantInit(&varEmpty);
m_strSql="SELECT*FROMstudent";
varStrSql.bstrVal=SysAllocString(m_strSql);
varStrSql.vt=VT_BSTR;
hr=m_pADOCERS->Open(varStrSql,varEmpty,MSADOCE:
:
adOpenDynamic,
MSADOCE:
:
adLockOptimistic,MSADOCE:
:
adCmdText);
SysFreeString(varStrSql.bstrVal);
if(FAILED(hr))
{
MessageBox(_T("打开数据库错误"),_T("系统信息"),MB_OK|MB_ICONINFORMATION);
return;
}
m_pADOCERS->AddNew(varEmpty,varEmpty);
strValue=dlg.m_studentID;
varFieldValue.bstrVal=SysAllocString(strValue);
varFieldValue.vt=VT_BSTR;
SetFieldValue(0,varFieldValue);
strValue=dlg.m_studentName;
varFieldValue.bstrVal=SysAllocString(strValue);
varFieldValue.vt=VT_BSTR;
SetFieldValue(1,varFieldValue);
varFieldValue.iVal=dlg.m_studentAge;
varFieldValue.vt=VT_I2;
SetFieldValue(2,varFieldValue);
strValue=dlg.m_studentClass;
varFieldValue.bstrVal=SysAllocString(strValue);
varFieldValue.vt=VT_BSTR;
SetFieldValue(3,varFieldValue);
m_pADOCERS->Close();
ShowData();//显示数据函数
}
}
[实验内容]
1、掌握在Windows下的DLL等组件的注册;
2、掌握利用ADOCE开发嵌入式数据库的过程;
3、掌握SQL语句的使用方法
[实验步骤]
第一步:
连接好实验系统,打开实验箱电源;
第二步:
利用VS打开数据库工程文件database.sln,由于本实验程序实现ADOCE组件的自动下传到目标板,必须在VS设置DLL组件的所在路径以及下传到目标板的路径,如图5-1所示。
图5-1ADOCE组件的自动下传设置
第三步:
编译database工程文件;点击运行按钮自动将所需要的文件下载(database.exe和ADOCE组件),运行界面如图5-2所示:
图5-2ADOCE数据库测试程序运行界面
第四步:
程序界面的操作过程:
(1)、控件注册操作:
单击“注册控件”按钮对ADOCE组件进行注册,只有ADOCE组件注册成功后采用进行其他操作。
(2)、新建数据库操作:
单击“新建数据库”按钮建立实验数据库;如果数据库存在可以跳过新建数据库步骤。
(3)、打开数据库操作:
单击“打开数据库”按钮打开数据库;
(4)、新建数据表操作:
单击“新建数据表”,程序自动建立一个名为“student”的数据表,且包括StuID、Name、age、class四个字段。
(5)、增加数据记录操作:
单击“增加记录”,可向数据库新增一条记录,运行界面如图5-3
图5-3增加记录界面
(6)、数据记录删除操作:
选中一条数据记录,然后单击“删除记录”按钮;
(7)、查询数据记录操作:
单击“查询记录”,可以查询符号条件的记录,运行界面如图5-4
图5-4数据记录查询界面
[习题与思考题]
1、修改源程序,增加对数据记录进行修改的操作;
2、源程序中查询记录和增加记录窗体采用同一个窗体文件,但其Caption显示分别为“查询记录”和“增加记录”,分析其实现过程。
3、如果需要对数据库中的数据表进行删除操作,应怎样实现?
4、修改源程序,增加一个“或”条件查询操作。