MFC使用ado连接SQLserver
2016-01-16 22:46
555 查看
做个小工具,记录MFC中用ado连接sqlserver2008的简要步骤。
首先还是简要介绍一下吧(一下这段为网上摘抄)
ADO接口简介
ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
_ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。
_RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口
,然后使用_RecordsetPtr执行存储过程和SQL语句。
首先建了个对话框工程,编辑好如下界面:
注意:要把ListControl的View属性设置成Report。
首先,引入ADO库文件。在StdAfx.h头文件中添加如下一行:
然后自定义数据库类,如AdoSql
各个成员函数的实现直接贴代码吧。
在对话框类里定义了一个显示数据到ListControl控件的函数
因为我希望打开对话框就显示数据,所以在BOOL CAdoSqlserverDlg::OnInitDialog()函数中我就调用了这个显示函数。
接下来一次编辑界面上4个按钮的响应函数
1、增加按钮:
2、修改按钮:
3、删除按钮:
4、清空按钮:
首先还是简要介绍一下吧(一下这段为网上摘抄)
ADO接口简介
ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
_ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。
_RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口
,然后使用_RecordsetPtr执行存储过程和SQL语句。
首先建了个对话框工程,编辑好如下界面:
注意:要把ListControl的View属性设置成Report。
首先,引入ADO库文件。在StdAfx.h头文件中添加如下一行:
#import "C://Program Files//Common Files//System//ado//msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
然后自定义数据库类,如AdoSql
class AdoSql { public: AdoSql(); virtual ~AdoSql(); void InitialConn(); //连接数据库 void ExitConn(); //断开数据库 void GetRecordSet(CString bstrSqlCmd); //获得记录集 void ExcuteCmd(CString bstrSqlCmd); //执行sql语句 public: _bstr_t m_bstrConn; //存储连接数据库的字符串 _bstr_t m_sqlCmd; //存储sql语句 _ConnectionPtr m_pConnection; //连接数据库对象指针 _RecordsetPtr m_pRecordSet; //数据集对象指针 };
各个成员函数的实现直接贴代码吧。
AdoSql::AdoSql() { m_pConnection = NULL; m_pRecordSet = NULL; InitialConn(); } AdoSql::~AdoSql() { } void AdoSql::InitialConn() { //初始化COM组件 ::CoInitialize(NULL); HRESULT hr = NULL; try { hr = m_pConnection.CreateInstance("ADODB.Connection"); //创建Connection对象 //hr = m_pConnection.CreateInstance(__uuidof(Connection));作用同上 //1、新建一个文件,名字任意取,后缀名必须为udl(如何hello.udl) //2、双击hello.udl文件,进入数据连接属性面板,填写好数据源(选择自己创建的数据源名字的) //3、再以记事本方式打开,第三行的数据就是连接字符 //m_bstrConn = "Provider=SQLNCLI10.1;Integrated Security="";Persist Security Info=False;User ID=sa;Password=123456;Initial Catalog=WORK;Data Source="";Initial File Name="";Server SPN="""; m_bstrConn = "Provider=SQLNCLI10.1;Integrated Security="";Persist Security Info=False;Initial Catalog=WORK;Data Source="";Initial File Name="";Server SPN="""; hr = m_pConnection->Open(m_bstrConn, "sa", "123456", adModeUnknown); if (!SUCCEEDED(hr)) { AfxMessageBox("连接数据库失败"); } } catch (_com_error e) { CString strErr; strErr.Format("连接数据库失败\n%s", e.ErrorMessage()); AfxMessageBox(strErr); } } void AdoSql::GetRecordSet(CString bstrSqlCmd) { m_sqlCmd = _bstr_t(bstrSqlCmd); //创建记录集指针对象实例 m_pRecordSet.CreateInstance(__uuidof(Recordset)); //打开记录集 m_pRecordSet->Open(m_sqlCmd, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); } void AdoSql::ExcuteCmd(CString bstrSqlCmd) { m_sqlCmd = _bstr_t(bstrSqlCmd); _variant_t RecordsAffected; try{ m_pRecordSet = m_pConnection->Execute(m_sqlCmd, &RecordsAffected, adCmdText); } catch(_com_error e) { AfxMessageBox(e.ErrorMessage()); } } void AdoSql::ExitConn() { //关闭记录集和连接 if (m_pRecordSet != NULL) { m_pRecordSet->Close(); } m_pConnection->Close(); ::CoUninitialize(); }
在对话框类里定义了一个显示数据到ListControl控件的函数
void CAdoSqlserverDlg::DispData() { adoSql.GetRecordSet("select * from course"); //初始化数据表 m_List.SetExtendedStyle(m_List.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //先清空数据表 m_List.DeleteAllItems(); m_List.InsertColumn(0, "课程编号", LVCFMT_LEFT, 100); m_List.InsertColumn(1, "课程名称", LVCFMT_LEFT, 100); m_List.InsertColumn(2, "课程简称", LVCFMT_LEFT, 100); m_List.InsertColumn(3, "班级编号", LVCFMT_LEFT, 100); int i = 0; while(!adoSql.m_pRecordSet->adoEOF) { m_List.InsertItem(i, ""); m_List.SetItemText(i, 0, (char*)(_bstr_t)adoSql.m_pRecordSet->GetCollect("课程编号")); m_List.SetItemText(i, 1, (char*)(_bstr_t)adoSql.m_pRecordSet->GetCollect("课程名称")); m_List.SetItemText(i, 2, (char*)(_bstr_t)adoSql.m_pRecordSet->GetCollect("课程简称")); m_List.SetItemText(i, 3, (char*)(_bstr_t)adoSql.m_pRecordSet->GetCollect("班级编号")); adoSql.m_pRecordSet->MoveNext(); i++; } adoSql.ExitConn(); }
因为我希望打开对话框就显示数据,所以在BOOL CAdoSqlserverDlg::OnInitDialog()函数中我就调用了这个显示函数。
接下来一次编辑界面上4个按钮的响应函数
1、增加按钮:
void CAdoSqlserverDlg::OnButtonAdd() { // TODO: Add your control notification handler code here UpdateData(); if (m_edit1=="" || m_edit2=="" || m_edit3=="" || m_edit4=="") { MessageBox("输入数据不完整!"); return; } CString strCmd; strCmd.Format("insert into course values('%s','%s','%s','%s')", m_edit1,m_edit2,m_edit3,m_edit4); adoSql.InitialConn(); adoSql.ExcuteCmd(strCmd); DispData(); }
2、修改按钮:
void CAdoSqlserverDlg::OnButtonModify() { // TODO: Add your control notification handler code here UpdateData(); if (m_edit1=="" || m_edit2=="" || m_edit3=="" || m_edit4=="") { MessageBox("输入数据不完整!"); return; } CString strCmd; strCmd.Format("update course set 课程编号='%s', 课程名称='%s', 课程简称='%s', 班级编号='%s' where 课程编号='%s'", m_edit1, m_edit2, m_edit3, m_edit4, m_selectCourseSN); adoSql.InitialConn(); adoSql.ExcuteCmd(strCmd); DispData(); }
3、删除按钮:
void CAdoSqlserverDlg::OnButtonDelete() { // TODO: Add your control notification handler code here CString strCmd; strCmd.Format("delete from course where 课程编号='%s'", m_selectCourseSN); adoSql.InitialConn(); adoSql.ExcuteCmd(strCmd); DispData(); }
4、清空按钮:
void CAdoSqlserverDlg::OnButtonClear() { // TODO: Add your control notification handler code here CString strCmd; strCmd.Format("delete from course", m_selectCourseSN); adoSql.InitialConn(); adoSql.ExcuteCmd(strCmd); DispData(); }
相关文章推荐
- 推荐Sql server一些常见性能问题的解决方法
- SQL Server存储过程的基础说明
- VB语言使用ADO连接、操作SQLServer数据库教程
- VB使用ADO操作Access数据库
- ADO存取数据库时如何分页显示
- SQL Server下几个危险的扩展存储过程
- 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程
- SQL Server中选出指定范围行的SQL语句代码
- Visual C++中MFC消息的分类
- 一些SQL Server存储过程参数及例子
- SQL Server优化50法汇总
- MFC中Radio Button的用法详解
- MFC对话框中添加状态栏的方法
- MFC创建右键弹出菜单的方法
- MFC中动态创建控件以及事件响应实现方法
- C++ 关于MFC多线程编程的注意事项
- MFC程序对文件的处理方法
- MFC自定义消息的实现方法
- MFC实现在文件尾追加数据的方法
- MFC之ComboBox控件用法实例教程