Click here to Skip to main content
15,885,278 members
Articles / Desktop Programming / MFC

MsAccess MdbTools with MFC and .NET

Rate me:
Please Sign up or sign in to vote.
4.82/5 (9 votes)
13 Jan 2012LGPL310 min read 69K   9.9K   49  
Viewer of MsAccess databases directly from MFC and .NET - Repair corrupt databases
#include "StdAfx.h"
#include "MFCMdbTable.h"

CMFCMdbTable::CMFCMdbTable(void)
{
	tdef = 0;
}


CMFCMdbTable::~CMFCMdbTable(void)
{
}
void CMFCMdbTable::LoadTableColumns()
{
	MdbCatalogEntry* entry = GetEntryByName(Name);

	tdef = mdb_read_table(entry);
	mdb_read_columns(tdef);
	mdb_read_indices(tdef);

	MdbColumn *pcol;
	CMFCMdbColumn column;
	//read columns and bind data
	columns.clear();

	for (int i=0;i<tdef->num_cols;i++)
	{
		pcol = (MdbColumn*)g_ptr_array_index(tdef->columns, i);
		column.Name = CString(pcol->name);
		
		cvalues[column.Name] = new char[256];
		pcol->bind_ptr = cvalues[column.Name];
				
		column.Type = (MFCMdbColType)pcol->col_type;
		columns[column.Name] = column;
	}

}
MFCMdbColGenType CMFCMdbTable::GetColumnGenType(MFCMdbColType type)
{
	switch (type)
	{
		case MFCMdb_INT: 
		case MFCMdb_LONGINT:
		case MFCMdb_FLOAT:
		case MFCMdb_DOUBLE:
		case MFCMdb_NUMERIC:
				return MFCMdbGen_NUMERIC;
		default:
				return MFCMdbGen_TEXT;
	}
}
CString CMFCMdbTable::GetStrValue(CMFCMdbColumn& col)
{
	CString cad;
	MFCMdbColGenType type = GetColumnGenType(col.Type);
	/*switch (type)
	{
		case MFCMdb_INT: 
		case MFCMdb_LONGINT:
				cad.Format("%05d", dvalues[col.Name]);
				break;
		case MFCMdb_FLOAT:
		case MFCMdb_DOUBLE:
		case MFCMdb_NUMERIC:
				cad.Format("%f", dvalues[col.Name]);
				break;
		default:
				cad = CString(cvalues[col.Name]);
				break;
	}*/

	return cvalues[col.Name];
}

MdbCatalogEntry* CMFCMdbTable::GetEntryByName(CString name)
{
	MdbCatalogEntry *entry;
	for (int i=0;i<mdb->num_catalog;i++)
	{
		entry = (MdbCatalogEntry*)g_ptr_array_index(mdb->catalog,i);
		CString cadaux(entry->object_name);
		if (cadaux == name)
			return entry;
	}
}
void CMFCMdbTable::MoveFirst()
{
	mdb_rewind_table(tdef);
}
BOOL CMFCMdbTable::NextItem()
{
	return mdb_fetch_row(tdef);
}
void CMFCMdbTable::ClearTableColumns()
{
	if (!tdef) return;
	mdb_free_tabledef(tdef);

	tdef = 0;
	for (auto itr=cvalues.begin(); itr != cvalues.end(); itr++)
	{
		char* value = (*itr).second;
		delete[] value;
	}
	
	cvalues.clear();
}
/*void CMFCMdbTable::AddRow()
{
	MdbField fields[256];
	MdbColumn *pcol;
	CString colname;
	CString strvalue;
	
	for (int i=0;i<tdef->num_cols;i++)
	{
		pcol = (MdbColumn*)g_ptr_array_index(tdef->columns, i);
		fields[i].colnum = pcol->col_num;
		colname = CString(pcol->name);
		
		strvalue = CString(cvalues[colname]);

		fields[i].value = cvalues[colname];
		fields[i].siz = strvalue.GetLength();
		fields[i].is_null = 0;
		fields[i].is_fixed = pcol->is_fixed;
	}
	mdb_insert_row(tdef, 1, fields);
}*/

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


Written By
Software Developer
Argentina Argentina
System developer from Argentina.

Programmed in VB 5,6,.NET, C#, Java, PL-SQL, Transac-SQL, C, C++ and even some "calculator" language.

Love to build small, useful applications.
Usually building big and complicated apps based on solid, reliable components.

Hobbies: reading, photography, chess, paddle, running.

Comments and Discussions