mfc list control 显示mysql,VC(MFC)以ADO连接数据库(基于控件ListControl)

MFC以ADO连接数据库的方法大致分为如下几个步骤:

1.在Stdafx.h中引入相应的dll文件

#import "c:/program files/common files/system/ado/msado15.dll" /

no_namespace /

rename ("EOF","adoEOF")

#import "c:/program files/common files/system/ado/msado15.dll" /

no_namespace /

rename ("EOF", "adoEOF")

2.在相应的App文件中声明连接变量

_ConnectionPtr m_pConnection;//多为public类型

_ConnectionPtr m_pConnection; //多为public类型

3.在相应的App文件的InitInstance()函数中构建变量m_pConnection的实例

AfxOleInit();//初始化相应的Com环境(这一句是必不可少的!!!)

m_pConnection.CreateInstance(__uuidof(Connection));

// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,

// 因为它有时会经常出现一些想不到的错误。(在后面的代码中我们省略这一步,以此类推)

try

{

// 打开本地Access库Demo.mdb

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);

}

catch(_com_error e)

{

AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");

returnFALSE;

}

AfxOleInit();//初始化相应的Com环境(这一句是必不可少的!!!)

m_pConnection.CreateInstance(__uuidof(Connection));

// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,

// 因为它有时会经常出现一些想不到的错误。(在后面的代码中我们省略这一步,以此类推)

try

{

// 打开本地Access库Demo.mdb

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);

}

catch(_com_error e)

{

AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");

return FALSE;

}

4.在相应的Dlg文件中声明相应的连接变量

_ConnectionPtr m_pConnection;

_CommandPtr m_pCommand;

_RecordsetPtr m_pRecordset;

_ConnectionPtr m_pConnection;

_CommandPtr m_pCommand;

_RecordsetPtr m_pRecordset;

5.在相应的Dlg的OnInitDialog()中声明ListControl的风格

( 此之前一定要记得为相应的ListControl控件添加相应的变量m_List

!!! )

DWORDdwStyle;// 设置新风格

dwStyle=::GetWindowLong(m_List.m_hWnd,GWL_STYLE);

dwStyle|=LVS_REPORT | LVS_SHOWSELALWAYS | LVS_EDITLABELS;

::SetWindowLong(m_List.m_hWnd,GWL_STYLE,dwStyle);

dwStyle=m_List.GetExtendedStyle();

dwStyle|=LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT;

m_List.SetExtendedStyle(dwStyle);

m_List.InsertColumn(0,"Columnname1",LVCFMT_CENTER,60);

m_List.InsertColumn(1,"Columnname2",LVCFMT_CENTER,60);//初始化ListControl控件的各个列

DWORD dwStyle; // 设置新风格

dwStyle=::GetWindowLong(m_List.m_hWnd,GWL_STYLE);

dwStyle|=LVS_REPORT | LVS_SHOWSELALWAYS | LVS_EDITLABELS;

::SetWindowLong(m_List.m_hWnd,GWL_STYLE,dwStyle);

dwStyle=m_List.GetExtendedStyle();

dwStyle|=LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT;

m_List.SetExtendedStyle(dwStyle);

m_List.InsertColumn(0,"Columnname1",LVCFMT_CENTER,60);

m_List.InsertColumn(1,"Columnname2",LVCFMT_CENTER,60); //初始化ListControl控件的各个列

6.声明相应的读取数据库函数ReadList()

voidCMyClass::ReadList()

{

UpdateData();

m_List.DeleteAllItems();//首先将ListControl中已有的数据清空,而后重新从数据库读入,以实现刷新效果

CString SQL,Columnname1,Columnname2......;

SQL.Format("select ,MajorName from Tablename where mdbColumnname1='%s'",m_Columnname1);

m_pRecordset=theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);

intCounter=0;

if(!(m_pRecordset->BOF))//若记录集指针未指向数据库中的首元素

{

m_pRecordset->MoveFirst();//则将其指向首元素位置

while(!m_pRecordset->adoEOF)//若记录集指针未指向数据库中的尾元素,则循环永远不会结束

{

Columnname1=(char*)(_bstr_t)m_pRecordset->GetCollect("mdbColumnname1");

Columnname1=(char*)(_bstr_t)m_pRecordset->GetCollect("mdbColumnname2");

//...............................

m_List.InsertItem(Counter,0);

m_List.SetItemText(Counter,0,Columnname1);//其中的Counter为行号;0为列号即字段号

m_List.SetItemText(Counter,1,Columnname2);//同上

//...........................................

m_pRecordset->MoveNext();

Counter++;

}

}

UpdateData(false);

}

void CMyClass::ReadList()

{

UpdateData();

m_List.DeleteAllItems();//首先将ListControl中已有的数据清空,而后重新从数据库读入,以实现刷新效果

CString SQL,Columnname1,Columnname2......;

SQL.Format("select ,MajorName from Tablename where mdbColumnname1='%s'",m_Columnname1);

m_pRecordset=theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);

int Counter=0;

if(!(m_pRecordset->BOF))//若记录集指针未指向数据库中的首元素

{

m_pRecordset->MoveFirst();//则将其指向首元素位置

while (!m_pRecordset->adoEOF)//若记录集指针未指向数据库中的尾元素,则循环永远不会结束

{

Columnname1=(char*)(_bstr_t)m_pRecordset->GetCollect("mdbColumnname1");

Columnname1=(char*)(_bstr_t)m_pRecordset->GetCollect("mdbColumnname2");

//...............................

m_List.InsertItem(Counter,0);

m_List.SetItemText(Counter,0,Columnname1);//其中的Counter为行号;0为列号即字段号

m_List.SetItemText(Counter,1,Columnname2);//同上

//...........................................

m_pRecordset->MoveNext();

Counter++;

}

}

UpdateData(false);

}

7.声明相应的添加记录函数AddList()

voidCMyClass::AddList()

{

CString SQL,m_Columnname1,m_Columnname2........;//声明SQL暂存字符串及其他可能用到的数据库字段暂存变量

UpdateData();

inteditmajorno=atoi(dlg.m_editmajorno);

SQL.Format("Insert into ...... (.......) Values (........)",m_Columnname1,m_Columnname2,.......);

theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);

ReadList(SQL);

}

void CMyClass::AddList()

{

CString SQL,m_Columnname1,m_Columnname2........;//声明SQL暂存字符串及其他可能用到的数据库字段暂存变量

UpdateData();

int editmajorno=atoi(dlg.m_editmajorno);

SQL.Format("Insert into ...... (.......) Values (........)",m_Columnname1,m_Columnname2,.......);

theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);

ReadList(SQL);

}

8.声明相应的删除记录函数DelList()

voidCMyClass::DelList()

{

// TODO: Add your control notification handler code here

CString SQL;

POSITION pos=m_List.GetFirstSelectedItemPosition();

intn=m_List.GetNextSelectedItem(pos);

charm_ID[30]={'/0'};

m_List.GetItemText(n,0,m_ID,sizeof(m_ID));

SQL.Format("Delete from Tablename where ID='%s'",m_ID);

theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);

ReadList(SQL);

}

void CMyClass::DelList()

{

// TODO: Add your control notification handler code here

CString SQL;

POSITION pos=m_List.GetFirstSelectedItemPosition();

int n=m_List.GetNextSelectedItem(pos);

char m_ID[30]={'/0'};

m_List.GetItemText(n,0,m_ID,sizeof(m_ID));

SQL.Format("Delete from Tablename where ID='%s'",m_ID);

theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);

ReadList(SQL);

}

9.声明相应的修改记录函数UpdList();

voidCMAJOR::OnUpdmajor()

{

CString SQL;

POSITION pos=m_List.GetFirstSelectedItemPosition();

intn=m_List.GetNextSelectedItem(pos);

charm_ID[30]={'/0'};

m_List.GetItemText(n,0,m_ID,sizeof(m_ID));

UpdateData();

SQL.Format("Update tablename Set Columnname1='%s',Columnname2='% s',......",m_Columnname1,m_Columnname2......);

theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);

ReadList(SQL);

}

void CMAJOR::OnUpdmajor()

{

CString SQL;

POSITION pos=m_List.GetFirstSelectedItemPosition();

int n=m_List.GetNextSelectedItem(pos);

char m_ID[30]={'/0'};

m_List.GetItemText(n,0,m_ID,sizeof(m_ID));

UpdateData();

SQL.Format("Update tablename Set Columnname1='%s',Columnname2='% s',......",m_Columnname1,m_Columnname2......);

theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);

ReadList(SQL);

}

10.以下是针对于ListControl的一些常用函数(补充中。。。)

1>m_List.InsertColumn(0,"name",LVCFMT_CENTER,60);

说明:该函数可快速实现ListControl控件相应字段的初始化

参数一:字段索引

参数二:字段名称

参数三:字段显示方式(样例中为居中显示)

参数四:字段默认宽度(样例中为60)

2>POSITION pos=m_List.GetFirstSelectedItemPosition();

说明:获得控件中当前选中记录的位置

int

n=m_List.GetNextSelectedItem(pos);

说明:由位置转化得到当前选中记录的行数

m_List.GetItemText(n,0,m_ID,sizeof(m_ID));

说明:获得当前选中记录中的某一个字段名

参数一:行数

参数二:列数

参数三:字段名的暂存变量

参数四:暂存变量的长度

  • 0
    点赞
  • 0
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值