万恶的微软之ADOCE苦旅

来源:互联网 发布:淘宝联盟买家有优惠吗 编辑:程序博客网 时间:2024/04/30 22:25

 万恶的微软,痛苦的ADOCE~~~~
近来一直很郁闷,都是万恶的微软闹的。当初选中VS2005平台就是看重他的高度集成性,可是猜中了这开头,却没料到这结局。早知道用EVC好了。哎~
原来搞的一套接口是基于odbc的,忙活半天才发现,PPC平台不支持ODBC。kao!于是考虑OLE-DB,后来发现ADO.NET非常方便,心驰神往啊~。又是手忙脚乱半天,居然发现VC++MOBILE项目中死活不能#using   <mscorlib.dll>   #using   <System.dll>     #using   <system.data.dll>   #using   namespace   System;     #using   namespace   System::Data;     #using   namespace   System::Data::OleDb;   !被告知:fatal error C1190: managed targeted code requires a '/clr' option。万恶的编译器~太无情了!傻傻的尝试在工程属性中添加Common Language Runtime支援。居然发现没有这一项,kao!几经周折,终于明白一个真理:
這個屬性是使用VC++2005開發.NET應用程式才能使用的屬性, 如果使用VC++2005開發裝置程式, 因為VC++2005不支援開發.NET平台的裝置應用程式(只支援開發Win32平台的裝置應用程式), 所以不能使用!
万能的神啊~万恶的微软。
没办法,只好走老路。考虑OLE-DB,后来发现有ADOCE这东西,已将OLE-DB封装,欣喜若狂。快乐的时光总是这样的短暂,不久便发现ADOCE是个阉货~短斤缺两不说,配置起来还很繁复。那位看官问了:有多繁复啊?我的回答是:那是相当的繁复。这一切只能归罪于万能的造物主创造了如此万恶的微软!
在ADOCE的苦旅之上有如此多的同行者,这是令人欣慰的事,起码不会觉的孤独和彷徨。在这一刻,我不是一个人在战斗。万恶的微软将我们禁锢在这.NET的牢笼之中,我们要冲出这牢笼,超越.NET,超越WINDOWS,超越这万恶的微软。当然这是后话……

切入正题,首先要认真研读一下文章《在evc中使用ADOCE的前期准备》,还有《EVC4及Adoce3.1安装心得》

下载:
① adocepbzip安装包:http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=929bb147-281c-4d6e-a727-67271075fadb&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2fado%2fCE-PB%2f3.1%2fWCE%2fEN-US%2fadocepbzip.exe
② VoAdo是VOS公司做的一个使用比较方便的ADOCONNECTION和ADORECOEDSET类,下载下来的需要修改(见3)才能使用,本压缩包的文件已经做了修改.在这里下载http://www.voscorp.com/products/developer/winmobile/voado/voado.zip
③adoce31.h和adocec31.h文件的生成:
在微软的adocepbzip安装包的adocepb/setup/Data Access 3.1/Program Files/DataAccess31/INCLUDE目录下,有这样两个文件adoce31.idl和adocec31.idl,在命令行中执行midl adoce31.idl和midl adocec31.idl即可生成.h文件.
注意:这里在vc6.0环境下生成的成功率比较高,.net的编译器很绝情
关于midl,请看blog中的扫盲:什么是IDL和MIDL?(转载)


1.将Adoce PPC_ARM文件夹:adocepb/setup/Data Access 3.1/Program Files/DataAccess31/DEVICE/ARM/SA1100/CE/RETAIL  中"需要使用的DLL"中的文件复制到设备的Windows文件夹下;
2.数据库程序中在使用VOADO之前注册这些DLL

CreateProcess(_T("RegSvrCe"),_T("/s Windows/adoce31.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 
CreateProcess(_T(
"RegSvrCe"),_T("/s Windows/Adoxce31.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 
CreateProcess(_T(
"RegSvrCe"),_T("/s Windows/Adocedb31.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 
CreateProcess(_T(
"RegSvrCe"),_T("/s Windows/Adoceoledb31.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 
CreateProcess(_T(
"RegSvrCe"),_T("/s Windows/Msdaer.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 
CreateProcess(_T(
"RegSvrCe"),_T("/s Windows/Msdaeren.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 
CreateProcess(_T(
"RegSvrCe"),_T("/s Windows/msdadc.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 
CreateProcess(_T(
"RegSvrCe"),_T("/s Windows/msdaosp.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 


3.将VoAdo中所有文件添加到你的工程中,将其中adoce30.h都改为adoce31.h;
4.将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");
5.将Include文件夹中的adoce31.h和adocec31.h添加到你的工程中;
6.将regsvrce.exe复制到设备中和你的数据库程序同一个文件夹下(该文件在Program Files/Microsoft eMbedded C++ 4.0/EVC/WCE400/TARGET/ARMV4文件夹下)。

至此~建立连接失败的错误被KO。但还是无法打开.sdf数据库。或许OLE-DB才是最终的出路,应验了毛老人家的一句话:自己动手丰衣足食。苍天啊,你要折磨到我什么时候?

真是令人心寒,反复翻阅SQLMOBILE联机帮助,发现一个惊人事实:尽管 SQL Server Mobile 支持两种数据访问技术(OLE DB provider for SQL Server Mobile 和 ADO .NET),但您在 Visual C++ 应用程序中只能使用 OLE DB。OLE DB 是一种低级数据接口技术,提供数据访问的粒度功能。在所有数据访问 API 中,OLE DB for SQL Server Mobile 的数据操作和访问速度最快。
一点脾气都没有了。身心俱疲~

2008.03.24修改

今天心情不错啊~终于解决一个大难题。上面提到的无法打开.sdf文件的问题终于被某彻底KO了

原先的问题是这个语句:

 

hr 
= iADOCEConn->Open(_T("/My Documents/XXX.sdf"),L"",L"",MSADOCE::adOpenUnspecified); 

hr返回值总为为负数。死活不回头。今天发现原来是SQLCE版本的问题在作祟。目标设备上原先装的是mobile版本,反复不行后,又装了SQL Server CE 2.0。混乱!SQLCE2.0的数据库在Mobile中无法打开。Mobile的在SQLCE2.0中也是无法打开的。真是生死冤家。原来就是贪图方便使用了Mobile自带的Northwind.sdf文件,结果遭到报应。哎~

现重新装过SQLCE,小心起见只装SQLCE2.0,用其创建一个简单的数据库test.sdf。尝试如下方法解决:

LPCTSTR   pcszProvider   =   _T("Provider   =   Microsoft.SQLSERVER.OLEDB.CE.2.0;data   source   =   /My Documents/test.sdf");   
  hr   
=   m_pConnection->put_Provider(_T("CEDB"));   
  hr   
=   m_pConnection->Open(lpDataSource,TEXT(""),TEXT(""),adOpenUnspecified);   
lpDataSource   
=   _T("Provider   =   Microsoft.SQLSERVER.OLEDB.CE.2.0;data   source   =   /My Documents/test.sdf");

还是不行的话请确定安装的版本是否为Microsoft SQL Server CE 2.0,如不是或者将数据库版本换成此版本 或者更改Provider。

至此,万恶的微软又一次倒在我们脚下,

原创粉丝点击