先看成品:
系统和Access软件都是64位的,通过安装accessdatabaseengine_x64.exe驱动(包含在文件当中)的实现将数据库的内容显示在MFC对话框控件上,并对数据库内容的增、删、改、查:
增加:增加一条与现有数据编号不同的数据;
删除:根据四个内任意数量的筛选条件的并集,对数据库内的数据进行删除;
修改:根据编号为数据进行修改;、
查询:根据四个内任意数量的筛选条件的并集,对数据库内的数据进行查询。
案例中的同学录的包含四项数据:姓名、籍贯、年龄。
MFC listcontrol控件加载内容代码如下
void CclassmatesDlg::DispBySql(CString sql)
{
CRecordset rs(&m_classmates);
rs.Open(CRecordset::dynaset, sql, CRecordset::none);
//获取列的数目
short sFieldCount = rs.GetODBCFieldCount();//获取filed的数量,有多少列
if (sFieldCount <= 0)
{
return;
}
//清空列表框中的数据,并重绘
m_list.DeleteAllItems();//删除所有的行
while (m_list.GetHeaderCtrl()->GetItemCount() > 0)//获取列的标题,获得列的数目
{
m_list.DeleteColumn(m_list.GetHeaderCtrl()->GetItemCount() - 1);//删除所有的列
}
m_list.SetRedraw(TRUE);
m_list.Invalidate();
m_list.UpdateWindow();
LV_COLUMN lvcolumn;
CRect rect;//列表空间的宽高信息
m_list.GetClientRect(&rect);//获取列表空间的宽高信息
for (short column = 0; column < sFieldCount; column++)
{
CODBCFieldInfo fInfo; //表头信息
rs.GetODBCFieldInfo(column, fInfo);
//MessageBox(fInfo.m_strName);
//设置 文本对齐方式|文本类型|列宽
lvcolumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
lvcolumn.fmt = LVCFMT_LEFT;//文本左对齐
lvcolumn.pszText = fInfo.m_strName.GetBuffer(fInfo.m_strName.GetLength());//根据要求的数据类型进行传输
fInfo.m_strName.ReleaseBuffer();//释放内存
lvcolumn.iSubItem = column;
lvcolumn.cx = rect.Width() / sFieldCount;//将列宽进行平均分配
m_list.InsertColumn(column, &lvcolumn);//插入列表框的标题
}
LV_ITEM lvitem;
CDBVariant var;
CString value;
while (!rs.IsEOF())
{
for (short column = 0; column < sFieldCount; column++)
{
rs.GetFieldValue(column, var);//获取字段的值
switch (var.m_dwType)
{
case DBVT_STRING:
value.Format(_T("%s"), var.m_pstring->GetBuffer(var.m_pstring->GetLength()));
break;
case DBVT_WSTRING:
value.Format(_T("%s"), var.m_pstring->GetBuffer(var.m_pstringW->GetLength()));
break;
case DBVT_LONG:
value.Format(_T("%ld"), var.m_lVal);
break;
case DBVT_SHORT:
value.Format(_T("%ld"), var.m_iVal);
break;
default:
value = _T("");
break;
}
if (column == 0)
{
lvitem.mask = LVFIF_TEXT;
lvitem.iItem = m_list.GetItemCount();
lvitem.iSubItem = column;
lvitem.pszText = value.GetBuffer(value.GetLength());//id 1,2,3
value.ReleaseBuffer();
lvitem.cchTextMax = value.GetLength();
m_list.InsertItem(&lvitem);//添加行数据的第一列,插入
}
else
{
lvitem.mask = LVFIF_TEXT;
lvitem.iItem = m_list.GetItemCount()-1;//插入的第一行是从0开始的,要减1
lvitem.iSubItem = column;//获得正处于第几列
lvitem.pszText = value.GetBuffer(value.GetLength());//id 1,2,3
value.ReleaseBuffer();
lvitem.cchTextMax = value.GetLength();
m_list.SetItem(&lvitem);//添加行数据的第2到第n列,设置
}
}
rs.MoveNext();//移到第下一行进行
}
}