文章出处:http://www.codeproject.com/KB/database/adonetinmfc.aspx
文章说明:本文是在原文基础上翻译并加以详细阐述写出来的,这是本人第一次翻译英文的文章,由于能力有限,不免会有许多瑕疵,还望各位大虾不吝指教。
代码下载:在原文的页面上有下载链接
前言
写这篇文章的主要目的是为了说明怎么样很容易的把.net的库与MFC库混合使用,在非托管代码中使用.net库,比如在MFC项目中使用ADO.NET。所以就写了一个MFC的DEMO,并且使用了ADO.NET这个既安全又强大的类库。因为最近公司的一个项目是在MFC框架下开发的,但又需要对数据进行读取,并且得将这些数据跟我们已经封装好的带数据绑定功能的树控件、列表控件进行类似于WPF控件那样的数据绑定,如果再定义一些例如DataSet的类又太麻烦,所以就来尝试下在MFC中使用ADO.NET。
ADO.NET
为了迎合当今开发者在技术上的需求,微软意识到了需要有一个新的建立在.Net FrameWork之上的数据连接编程模式。要想建立在.Net FrameWork之上,就必须确保数据连接技术通用、组建共享一个通用类型系统(CTS)、设计模式和命名规定。ADO.NET的设计就符合这些新的编程模式的需求如:非连接数据结构、彻底的集成XML、多种数据源的数据呈现、最佳的设备与数据库相互制约,所有的这些都完全符合.Net FrameWork。
托管和非托管代码的混合使用
为了在MFC的框架下使用托管代码,我们必须更改MFC工程的一些设置,然后增加对.net库的声明。
更改MFC工程设置
在你的项目属性设置对话框中更改下面几项。
常规 - 启用托管增量生成 = 是
C/C++ - 常规 - 调试信息格式 = 程序数据库(/Zi)
C/C++ - 代码生成 - 启用最小重新生成 = 否
C/C++ - 代码生成 - 基本运行时检查 = 默认值
在配置好这些以后编译器就会生成类库函数的托管版本和非托管版本。
在工程中添加引用
现在就可以在你任何想使用托管代码的地方加入以下代码了。如果要在很多地方使用托管代码建议你把这些代码加入到stdafx.h文件中。
#pragma managed
#using <mscorlib.dll>
#using <System.dll>
#using <system.data.dll>
#using namespace System;
#using namespace System::Data;
#using namespace System::Data::OleDb;
托管编译指示器会打开函数级别控制(function-level control)去编译所有函数生成托管代码。非托管函数会编译为内部平台,程序这一部分的执行将由公共语言运行时传输到内部平台。因为我们在MFC工程中使用ADO.NET,所以必须包含System::Data,然后我们想使用微软的数据库连接,还得再包含System::Data::OleDb。
在托管类中使用__gc指针
为了在类中添加一个托管代码的指针成员,我们必须使用__gc指针。当然了在类中添加一个非托管的类型对象为__gc指针是非法的。为了使指向托管类型的对象在堆上开辟空间,头文件vcclr.h提供安全类型(type-safe)包装的模板gcroot。使用这个模板我们就可以将一个有效的__gc指针添加到非托管的类中了,就会认为这个指针就是一个普通指针类型。系统已经默认在你的项目中包含了vcclr.h头文件,在Microsoft Visual Studio 9.0/VC/include下会找到该文件。
下面是声明托管类型对象的方式:
gcroot<OleDbConnection*> m_OleDbConnection;
gcroot<OleDbCommand*> m_OleDb;
gcroot<OleDbDataReader*> m_Reader;
编写托管代码示例
#pragma push_macro("new") ,#undef new 和 #pragma pop_macro("new")是在DEBUG模式下使用的。否则编译会显示错误:配置参数不允许产生托管类型的实例。
注:使用VC助手的朋友要注意啦。可能是使用的是.net的内容,所以涉及到托管代码的地方没有语法高亮,我想肯定有办法能解决,在这里我就不做研究了,希望知道解决办法的大虾们能留言告诉我。在我的博客里我以后也会写一些ADO.NET在MFC中更详细的使用方法。
参考文章:http://msdn.microsoft.com/zh-tw/library/dd229218.aspx 关于通用类型系统的
2010-12-312010-12-31