MFC使用ado连接SQLserver

做个小工具,记录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头文件添加如下一行:

#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,"课程名称",100);
    m_List.InsertColumn(2,"课程简称",100);
    m_List.InsertColumn(3,"班级编号",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')",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_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();
}

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...