![]() |
Database »
Database »
ADO.NET
Intermediate
Using ADO.NET in MFC ProjectsBy Majid ShahabfarMixing managed and unmanaged code and using .NET library in MFC projects |
C++/CLI, VC6, VC7, VC7.1, .NET, Win2K, WinXP, Win2003, MFC, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||

In designing tools and technologies to meet the needs of today's developer, Microsoft recognized that an entirely new programming model for data access was needed, one that is built upon the .NET Framework. Building on the .NET Framework ensures that the data access technology would be uniform, components would share a common type system, design patterns and naming conventions. ADO.NET was designed to meet the needs of this new programming model: disconnected data architecture, tight integration with XML, common data representation with the ability to combine data from multiple and varied data sources, and optimized facilities for interacting with a database, all native to the .NET Framework.
To use managed code in a MFC projects we must change some MFC project settings and add some code to declare the .NET library.
Changing Configuration
To alter the configuration of your MFC project to use unmanaged code, change the following items in the Configuration Properties dialog box.
General - Use Managed Extensions = YES
C/C++ - General - Debug Information Format = Program Database (/Zi)
C/C++ - General - Compile As Managed = Assembly Support (/clr)
C/C++ - Code Generation - Enable Minimal Rebuild = No
C/C++ - Code Generation - Basic Runtime Checks = Default
The /clr compiler option provides module-level control for compiling functions either as managed or unmanaged. Now you must add the following code wherever you want to use managed code. If you want use managed code in several classes of your project it is better that you add this code to the stdafx.h file.
#pragma managed
#using <mscorlib.dll>
#using <System.dll>
#using <system.data.dll>
#using namespace System;
#using namespace System::Data;
#using namespace System::Data::OleDb;
The managed pragma enables function-level control for compiling functions as managed. An unmanaged function will be compiled for the native platform, and execution of that portion of the program will be passed to the native platform by the common language runtime.
Because we are using ADO.NET in our project so we have to add System::Data and since we want to use the MS Access database we have added System::Data::OleDb.
To declare a managed pointer as member in a class we must use __gc pointers. It is illegal to declare a member of an unmanaged class to have __gc pointer type. In order to point to a managed object from the C++ heap, the header file vcclr.h provides the type-safe wrapper template gcroot. Use of this template allows the programmer to embed a virtual __gc pointer in an unmanaged class and treat it as if it were the underlying type. The header file vcclr.h is included in VS.NET by default and you don�t need to include it to your application. Anyway this file can be found in the \Microsoft Visual Studio .NET\Vc7\include directory.
gcroot<OleDbConnection*> m_OleDbConnection;
gcroot<OleDbCommand*> m_OleDb;
gcroot<OleDbDataReader*> m_Reader;
Now it is time to write managed code in an unmanaged function.
#pragma push_macro("new")
#undef new
try
{
m_OleDbConnection = new OleDbConnection(
S"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.mdb"
);
m_OleDbConnection->Open(); // Open up the connection
m_OleDb = new OleDbCommand(S"select * from Persons", m_OleDbConnection);
m_Reader = m_OleDb->ExecuteReader();
int count = 0;
while (m_Reader->Read())
{
AddToList(count,m_Reader->get_Item("First Name")->ToString(),
m_Reader->get_Item("Last Name")->ToString(),
m_Reader->get_Item("Phone Number")->ToString()
);
count++;
}
}
catch(Exception *e)
{
AfxMessageBox(CString(e->ToString()));
}
__finally
{
m_Reader->Close();
m_OleDbConnection->Close();
}
#pragma pop_macro("new")
the #pragma push_macro("new"), #undef new and #pragma pop_macro("new") are used when your project is in debug mode. Otherwise you will get errors saying placement arguments not allowed while creating instances of managed classes.
This was a small sample that indicates how we can use .NET library in MFC based projects. By following this sample You can write more complicated projects and using more benefits of .NET. It is easy to cope with and entirely feasible to extend your own MFC applications with managed code.
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 9 Aug 2003 Editor: Rob Manderson |
Copyright 2003 by Majid Shahabfar Everything else Copyright © CodeProject, 1999-2009 Web15 | Advertise on the Code Project |