分类: C/C++
2008-12-18 12:45:19
偶的blog新开,也不知道放点什么东西上来适当些,前些日子搞了一段时间的CE设备数据采集器(也就是装有CE系统的掌上电脑啦)。那趁这个机会,作个总结吧。 既然是作数据采集方面的,当然少不了对数据的存储了。在此,偶用的CDB格式的ACCESS数据库,就是一个简化了的MDB版本。对于新手来说,CE上连接数据库是件比较麻烦的事情,因为很多事情都要自己动手做,现成的别人已经开发好的东西很少。 就拿将MDB格式的数据库转化成CDB数据库来说吧。本来装了微软的ActiveSync的软件之后,当你把MDB数据库拷贝到掌机上的时候,它本身就有个功能是自动得将MDB数据库转化成CDB的。但是,这有个前提:目标的CE系统必须是已经装好了数据库驱动的。问题就出现了,这个驱动怎么装? 一、数据库驱动安装: 看了很多资料,了解到网上个有个cab的驱动包,名字叫作:adoce31.arm.cab,214K大小(这个是arm4版本的),不知道微软上面有没有,但是在网上搜下,应该不难找到。当我兴致冲冲的下载了之后,本以为应该一装上就应该没问题了。其实,不然~!虽然在CE上安装是成功的,但是当我试着转化MDB的时候,问题同样出现了,错误提示:转化失败,远程过程调用失败! 怎么回事?装和不装是一个结果?于是又在网上搜,功夫不负有心人,又被我发现了8个DLL,哈哈~!据说,这8个DLL也同样是来自微软的一个安装包:adocepbzip,下载地址: 好了,东西有了,但是光有DLL文件拷贝到CE上有什么用。。。对了,要注册嘛~!ActiveSync软件的安装目录下有个叫REGSVRCE.EXE的文件,记得他的版本也要和目标机子的板子型号匹配,把它拷进CE的根目录下,然后再写个批处理文件,命名reg.bat,然后用记事本写入如下: cd /windows regsvrce adoce31.dll regsvrce Adoxce31.dll regsvrce Adocedb31.dll regsvrce Adoceoledb31.dll regsvrce Msdaer.dll regsvrce Msdaeren.dll regsvrce msdadc.dll regsvrce msdaosp.dll 保存之后,同样也拷贝到CE根目录下,然后把8个DLL文档拷贝到CE的windows目录下,运行CE的命令提示符,输入 >reg 命令既开始注册。有了这8个DLL,再加上之前的adoce31.arm.cab安装包,就可以配合的天衣无缝了,哈哈,但是有个顺序问题,在我现有的这批机子上一定要先注册DLL,安装CAB的包才能成功。不知道在别的机子是怎么样的情况,没试过,也没条件试,呵呵(这东西,动不动就要万把块钱,自己可买不起~!)。 真搞不懂,微软到底是干什么使的,提供的资料又这么七零八碎的~! 二、连接数据库 有了上面的准备工作,后面的就好做多了。通过偶在网上差不多10来天的研究和搜索下,据偶所知,网上有一个已经开发好的ADO类(这是对像我这等懒人的福音阿~!) 其实该组件总共有3个文件,VOString.h,vorecordset.h,voconnection.h和对应的cpp文件,可以在http://www.voscorp.com/products/developer/winmobile/voado/voado.zip下载得到一个VoAdo的压缩包,解压之后,就OK了。然后还要配合2个文件:adoce31.h,adocec31.h,这2个文件据说也可以在adocepbzip压缩包里得到,不过是间接的,压缩包里有这样两个文件 adoce31.idl和adocec31.idl,在命令行中执行midl adoce31.idl和midl adocec31.idl即可生成.h文件. 上面的搞定之后,a、将VoAdo中所有文件添加到你的工程中,将其中ado??30.h都改为ado??31.h; b、将vorecordset.h文件中此处改为 BOOL CVORecordset::g_Init = FALSE; CLSID CVORecordset::g_ClsID; TCHAR* CVORecordset::g_ProgID=TEXT("ADOCE.Recordset.3.1"); 原来第3句为 TCHAR* CVORecordset::g_ProgID=TEXT("ADOCE.Recordset.3.0"); C、将Include文件夹中的adoce31.h和adocec31.h添加到工程中。 到此为止,应该算所有的准备工作都做好了,后面要做的,仅仅是调用他的类了: //声明对象指针 CVOConnection *m_Conn; CVORecordset *m_Set;
//初始化 m_Conn=new CVOConnection(cdbName); m_Set=new CVORecordset(*m_Conn); m_Set->Initialize(); m_Set->Open(s_SqlArea,adOpenForwardOnly,adLockOptimistic); 注意,要进行连接错误的检查,当所有的都成功之后,就可以用m_Set->GetFieldValueString(i)来获取数据库中的字符串了,存储的话,也是和一般的数据库操作类似。 |