C++实现连接SQL SERVER2008(_ConnectionPtr、_RecordsetPtr、_CommandPtr)

一、环境配置

映入ADO动态库:#import "C:\Program Files\Common Files\System\ado\msado15.dll"  no_namespace rename("EOF","EndOfFile") rename("BOF","FirstOfFile")

二、软件界面

C++实现连接SQL SERVER2008(_ConnectionPtr、_RecordsetPtr、_CommandPtr)_第1张图片

三、源码


// testDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "test.h"
#include "testDlg.h"
#include "afxdialogex.h"
#include "UpdateData.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();

// 对话框数据
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()

// CtestDlg 对话框
CtestDlg::CtestDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CtestDlg::IDD, pParent)
    , m_sip(_T(""))
    , m_sDatabaseName(_T(""))
    , m_sUserID(_T(""))
    , m_sPasswd(_T(""))
    , m_sPort(_T(""))
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CtestDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST1, m_list);
    DDX_Control(pDX, IDC_EDIT_IP, m_ip);
    DDX_Control(pDX, IDC_EDIT_DATABASE_NAME, m_databaseName);
    DDX_Control(pDX, IDC_EDIT_USER_ID, m_userID);
    DDX_Control(pDX, IDC_EDIT_PASSWD, m_passwd);
    DDX_Text(pDX, IDC_EDIT_IP, m_sip);
    DDX_Text(pDX, IDC_EDIT_DATABASE_NAME, m_sDatabaseName);
    DDX_Text(pDX, IDC_EDIT_USER_ID, m_sUserID);
    DDX_Text(pDX, IDC_EDIT_PASSWD, m_sPasswd);
    DDX_Control(pDX, IDC_EDIT_PORT, m_port);
    DDX_Text(pDX, IDC_EDIT_PORT, m_sPort);
}

BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BTN_CONNECT, &CtestDlg::OnBnClickedBtnConnect)
    ON_BN_CLICKED(IDC_BTN_QUERY, &CtestDlg::OnBnClickedBtnQuery)
    ON_BN_CLICKED(IDC_BTN_ADD, &CtestDlg::OnBnClickedBtnAdd)
    ON_BN_CLICKED(IDC_BTN_DELETE, &CtestDlg::OnBnClickedBtnDelete)
    ON_BN_CLICKED(IDC_BTN_MODIFY, &CtestDlg::OnBnClickedBtnModify)
END_MESSAGE_MAP()


// CtestDlg 消息处理程序
BOOL CtestDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    //1. 初始化界面
    iniUI();    

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CtestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CtestDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

        // 使图标在工作区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CtestDlg::OnQueryDragIcon()
{
    return static_cast(m_hIcon);
}
void CtestDlg::iniUI()

    //1. 设置数据库连接的默认值
    m_ip.SetWindowTextW(L"192.168.0.145");
    m_databaseName.SetWindowTextW(L"LeiMan");
    m_userID.SetWindowTextW(L"sc");
    m_passwd.SetWindowTextW(L"000000");
    m_port.SetWindowTextW(L"1433");

    //2. 没连接数据库之前 不允许 查询、增加、删除、修改数据
    (CButton*)GetDlgItem(IDC_BTN_QUERY)->EnableWindow(FALSE);
    (CButton*)GetDlgItem(IDC_BTN_ADD)->EnableWindow(FALSE);
    (CButton*)GetDlgItem(IDC_BTN_DELETE)->EnableWindow(FALSE);
    (CButton*)GetDlgItem(IDC_BTN_MODIFY)->EnableWindow(FALSE);

    //3. 设置列表的属性
    DWORD dwStyle = m_list.GetExtendedStyle();
    dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER;
    m_list.SetExtendedStyle(dwStyle);
    m_list.GetHeaderCtrl()->EnableWindow(0);
}


//连接数据库
void CtestDlg::OnBnClickedBtnConnect()
{    
    //1. 创建Connection对象
    m_pConnection.CreateInstance(_uuidof(Connection));     
    m_pRecordSet.CreateInstance(_uuidof(Recordset));
    m_pCommand.CreateInstance(_uuidof(Command));
    m_pConnection->ConnectionTimeout = 1;             //设置连接时间  
    //m_pConnection->CommandTimeout = 1;
    //TRACE("%s\n",m_sConn);    

    //2. 连接数据库
    try
    { 
        //2.1 把界面 用户输入 IP、账户、密码、端口号和数据库名称 更新到关联变量
        UpdateData(TRUE);        

        //2.2 拼接成 登录 数据的 字符串
        CString sConncet;
        //sConncet.Format(L"Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s,%s", m_sPasswd, m_sUserID, m_sDatabaseName, m_sip, m_sPort);
        //sConncet.Format(L"driver={SQL Server};Server=%s,%s;DATABASE=%s;UID=%s;PWD=%s", m_sip, m_sPort, m_sDatabaseName, m_sUserID, m_sPasswd);
        //sConncet.Format(L"driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s", m_sip, m_sDatabaseName, m_sUserID, m_sPasswd);
        //sConncet.Format(L"Persist Security Info=False;Integrated Security=SSPI;database=LeiMan;server=mkjj;Connect Timeout=1");
        
        //sConncet.Format(L"driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s", m_sip, m_sDatabaseName, m_sUserID, m_sPasswd);
        sConncet.Format(L"Provider=SQLNCLI10;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s,%s", m_sPasswd, m_sUserID, m_sDatabaseName, m_sip, m_sPort);
        _bstr_t strConnect(sConncet);        

        //2.3 登录数据库
        if (m_pConnection->State) m_pConnection->Close();             //如果已经打开了连接则关闭它    
        //HRESULT hr = m_pConnection->Open(strConnect, _bstr_t(m_sUserID), _bstr_t(m_sPasswd), adModeUnknown);                
        HRESULT hr = m_pConnection->Open(_bstr_t(_T("Provider=SQLNCLI10;Server=192.168.0.145,1433;Database=LeiMan;Uid=sc; Pwd=000000;")), _bstr_t(_T("sc")), _bstr_t(_T("000000")), adOpenUnspecified);    

        if (FAILED(hr))       
        {  
            //2.4 登录失败 时 提示用户
            MessageBox(L"连接数据库失败!", MB_OK, MB_ICONERROR);
            return ;       
        }      
        else
        {
            //2.5 登录成功 把m_pRecordSet 与 m_pConnection关联,方便后面进行增删改查
            m_pCommand->PutActiveConnection(_variant_t(m_pConnection.GetInterfacePtr()));
            m_pCommand->CommandType = adCmdText;

            //2.6 提示用户登录数据库成功 并把增删改查按钮 设置为可点击
            MessageBox(L"连接数据库成功!", MB_OK, MB_ICONASTERISK);
            (CButton*)GetDlgItem(IDC_BTN_QUERY)->EnableWindow(TRUE);
            (CButton*)GetDlgItem(IDC_BTN_ADD)->EnableWindow(TRUE);
            (CButton*)GetDlgItem(IDC_BTN_DELETE)->EnableWindow(TRUE);
            (CButton*)GetDlgItem(IDC_BTN_MODIFY)->EnableWindow(TRUE);
        }

        UpdateData(FALSE);
    }  
    catch(_com_error e)    
    {        
        //3.1 出现异常时 提示用户异常的原因
        MessageBox(e.Description(), MB_OK, MB_ICONERROR);

        return ;    
    }
}

void CtestDlg::OnBnClickedBtnQuery()
{        
    try
    {
        int nColumnCount = m_list.GetHeaderCtrl()->GetItemCount(); 
        for (int i = nColumnCount - 1; i >= 0; i--) m_list.DeleteColumn(i);
        m_list.DeleteAllItems();

        DWORD dwStyle = m_list.GetExtendedStyle();
        dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER;
        m_list.SetExtendedStyle(dwStyle);

        clock_t start = clock();          

        //1. 先查出最早的时间
        m_pCommand->CommandText = _bstr_t("SELECT  TOP (1) 操作时间 FROM COB WHERE (工序 = '固晶') AND (条码号 = '692345065') order by 操作时间 desc");
        _RecordsetPtr pRet = m_pCommand->Execute(NULL, NULL, adCmdText);        
        
        //2. 取出所有查询结果    
        CString sTime;
        int iCount = pRet->Fields->Count; //得到字段的总数
        while (!pRet->EndOfFile)
        {
            //3.1 取其他字段的值
            for (int i = 0; i < iCount; i++)
            {
                FieldPtr fieldCtl = pRet->Fields->GetItem(long(i));
                _variant_t varValue = fieldCtl->Value;
                _bstr_t bstrValue = ((varValue.vt == VT_NULL) ? "NULL" : varValue);    
                sTime = bstrValue.GetBSTR();
            }

            pRet->MoveNext();    
        }
        pRet->Close();        

        //3. 查询数据 sTime = ""
        CString sSql;
        sSql.Format(L"SELECT x坐标, y坐标 FROM COB WHERE (工序 = '固晶') AND (条码号 = '692345065') AND  操作时间='%s'", sTime);

        m_pCommand->CommandText = _bstr_t(sSql);
        pRet = m_pCommand->Execute(NULL, NULL, adCmdText);

        clock_t finish = clock();    
        float duration = (double)(finish - start) / CLOCKS_PER_SEC;  
        TRACE("查询一条数据花费的时间:%f\r\n", duration);
        
        //3. 取出所有查询结果    
        iCount = pRet->Fields->Count; //得到字段的总数
        m_list.InsertColumn(0, L"序号", LVCFMT_CENTER, 80);
        for (int i = 0; i < iCount; i++)
        {
            FieldPtr fieldCtl = pRet->Fields->GetItem(long(i)); //得到字段名控件
            m_list.InsertColumn(i+1, fieldCtl->Name, LVCFMT_CENTER, 80);
        }

        int iSize = 0;
        while (!pRet->EndOfFile)
        {
            //3.1 取其他字段的值
            char buf[1024] = {0};
            int iRow = m_list.GetItemCount();
            int iIndex = m_list.InsertItem(iRow, CString(itoa(iRow+1, buf, 10)));
            for (int i = 0; i < iCount; i++)
            {
                FieldPtr fieldCtl = pRet->Fields->GetItem(long(i));
                _variant_t varValue = fieldCtl->Value;
                _bstr_t bstrValue = ((varValue.vt == VT_NULL) ? "NULL" : varValue);    

                m_list.SetItemText(iIndex, i+1, bstrValue);
            }

            //3.2 准备处理下一条记录
            iSize++;
            if (iSize == 10000) break;
            pRet->MoveNext();    
        }

        pRet->Close();
        autoAdjustColumnWidth(&m_list);
    }
    catch (_com_error e)
    {
        MessageBox(e.Description(), MB_OK, MB_ICONERROR);
        //TRACE(_T("Warning: GetMode 发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
    }    
}

//查询数据
//void CtestDlg::OnBnClickedBtnQuery()
//{        
//    try
//    {
//        int nColumnCount = m_list.GetHeaderCtrl()->GetItemCount(); 
//        for (int i = nColumnCount - 1; i >= 0; i--) m_list.DeleteColumn(i);
//        m_list.DeleteAllItems();
//
//        DWORD dwStyle = m_list.GetExtendedStyle();
//        dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER;
//        m_list.SetExtendedStyle(dwStyle);
//
//        clock_t start = clock();          
//
//        clock_t start2 = clock();
//
//
//        //1. 执行查询,得到结果集于m_pRecordSet中
//        m_pCommand->CommandText = _bstr_t("SELECT x坐标, y坐标 FROM COB WHERE (工序 = '固晶') AND (条码号 = '692345065') AND \
//                                          操作时间=(SELECT  TOP (1) 操作时间 FROM COB WHERE (工序 = '固晶') AND (条码号 = '692345065') order by 操作时间 desc)");
//        
//        //m_pCommand->CommandText = _bstr_t("SELECT x坐标, y坐标 FROM aaa WHERE 1 = 2");
//        //m_pCommand->CommandText = _bstr_t("select 操作时间 from aaa where 工序='固晶' and 条码='6923450656181' order by 操作时间 desc");
//        //m_pCommand->CommandText = _bstr_t("select * from aaa where 工序='固晶' and 条码='6923450656181' order by 操作时间 desc");         
//
//        //m_pCommand->CommandText = _bstr_t("select * from COB");        
//
//        //m_pCommand->ActiveConnection = m_pConnection;
//        //m_pCommand->CommandType = adCmdText;
//        _RecordsetPtr pRet = m_pCommand->Execute(NULL, NULL, adCmdText);
//
//        clock_t finish2 = clock();    
//        float duration2 = (double)(finish2 - start2) / CLOCKS_PER_SEC;  
//        TRACE("查询数据花费的时间:%f\r\n", duration2);
//
//        if (pRet->EndOfFile)       
//        {  
//            AfxMessageBox(L"查询数据错误", MB_OK, MB_ICONERROR); 
//            return ;       
//        }  
//
//        //2. 根据结果集,重新设置列标题
//        int iCount = pRet->Fields->Count; //得到字段的总数
//        m_list.InsertColumn(0, L"序号", LVCFMT_CENTER, 80);
//        for (int i = 0; i < iCount; i++)
//        {
//            FieldPtr fieldCtl = pRet->Fields->GetItem(long(i)); //得到字段名控件
//            m_list.InsertColumn(i+1, fieldCtl->Name, LVCFMT_CENTER, 80);
//        }
//
//        //3. 取出所有查询结果    
//        int iSize = 0;
//        while (!pRet->EndOfFile)
//        {
//            //3.1 取其他字段的值
//            char buf[1024] = {0};
//            int iRow = m_list.GetItemCount();
//            int iIndex = m_list.InsertItem(iRow, CString(itoa(iRow+1, buf, 10)));
//            for (int i = 0; i < iCount; i++)
//            {
//                FieldPtr fieldCtl = pRet->Fields->GetItem(long(i));
//                _variant_t varValue = fieldCtl->Value;
//                _bstr_t bstrValue = ((varValue.vt == VT_NULL) ? "NULL" : varValue);    
//
//                m_list.SetItemText(iIndex, i+1, bstrValue);
//            }
//
//            //3.2 准备处理下一条记录
//            iSize++;
//            if (iSize == 10000) break;
//            pRet->MoveNext();    
//        }
//
//        clock_t finish = clock();    
//        float duration = (double)(finish - start) / CLOCKS_PER_SEC;  
//        TRACE("查询一条数据花费的时间:%f\r\n", duration);
//
//        pRet->Close();
//        autoAdjustColumnWidth(&m_list);
//    }
//    catch (_com_error e)
//    {
//        MessageBox(e.Description(), MB_OK, MB_ICONERROR);
//        //TRACE(_T("Warning: GetMode 发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
//    }    
//}

//查询数据2
//void CtestDlg::OnBnClickedBtnQuery()
//{    
//    try
//    {
//        int nColumnCount = m_list.GetHeaderCtrl()->GetItemCount(); 
//        for (int i = nColumnCount - 1; i >= 0; i--) m_list.DeleteColumn(i);
//        m_list.DeleteAllItems();
//
//        //1. 执行查询,得到结果集于m_pRecordSet中 
//        if (m_pRecordSet->State) m_pRecordSet->Close();
//        HRESULT hr = m_pRecordSet->Open("select * from aaa", m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
//
//        if (FAILED(hr))       
//        {  
//            AfxMessageBox(L"查询数据错误", MB_OK, MB_ICONERROR); 
//            return ;       
//        }  
//
//        //2. 根据结果集,重新设置列标题
//        int iCount = m_pRecordSet->Fields->Count; //得到字段的总数
//        m_list.InsertColumn(0, L"序号", LVCFMT_CENTER, 80);
//        for (int i = 0; i < iCount; i++)
//        {
//            FieldPtr fieldCtl = m_pRecordSet->Fields->GetItem(long(i)); //得到字段名控件
//            m_list.InsertColumn(i+1, fieldCtl->Name, LVCFMT_CENTER, 80);
//        }
//
//        //3. 取出所有查询结果    
//        while (!m_pRecordSet->EndOfFile)
//        {
//            //3.1 取其他字段的值
//            char buf[1024] = {0};
//            int iRow = m_list.GetItemCount();
//            int iIndex = m_list.InsertItem(iRow, CString(itoa(iRow, buf, 10)));
//            for (int i = 0; i < iCount; i++)
//            {
//                FieldPtr fieldCtl = m_pRecordSet->Fields->GetItem(long(i));
//                _variant_t varValue = fieldCtl->Value;
//                _bstr_t bstrValue = ((varValue.vt == VT_NULL) ? "NULL" : varValue);    
//
//                m_list.SetItemText(iIndex, i+1, bstrValue);
//            }
//
//            //3.2 准备处理下一条记录
//            m_pRecordSet->MoveNext();    
//        }
//
//        //m_pRecordSet->Close();
//        autoAdjustColumnWidth(&m_list);
//    }
//    catch (_com_error e)
//    {
//        MessageBox(e.Description(), MB_OK, MB_ICONERROR);
//    }
//}

//使表格内容自适应宽度
void CtestDlg::autoAdjustColumnWidth(CListCtrl* pListCtrl)
{
    if (pListCtrl == NULL) return;

    pListCtrl->SetRedraw(FALSE);

    CHeaderCtrl *pHeader = pListCtrl->GetHeaderCtrl();
    int nColumnCount = pHeader->GetItemCount();
    for(int i = 0; i < nColumnCount; i++)
    {
        pListCtrl->SetColumnWidth(i, LVSCW_AUTOSIZE);

        int nColumnWidth = pListCtrl->GetColumnWidth(i);
        pListCtrl->SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);

        int nHeaderWidth = pListCtrl->GetColumnWidth(i);
        pListCtrl->SetColumnWidth(i, max(nColumnWidth, nHeaderWidth)+5);
    }

    pListCtrl->SetRedraw(TRUE);
}

//增加数据
void CtestDlg::OnBnClickedBtnAdd()
{
    CUpdateData dlg(this);
    dlg.DoModal();
}

//删除数据
void CtestDlg::OnBnClickedBtnDelete()
{    
    USES_CONVERSION;

    //1. 获取当前用户要删除的行号
    POSITION pos = m_list.GetFirstSelectedItemPosition();   
    int iRow = m_list.GetNextSelectedItem(pos);   
    if (iRow < 0)
    {
        MessageBox(L"请选择要删除的行", MB_OK, MB_ICONERROR);
        return;
    }

    try
    {
        CString sSql;

        //2. 把要删除那一条数据 的 每个字段名 和 字段值 从界面列表取出来
        int iCols = m_list.GetHeaderCtrl()->GetItemCount(); 
        for (int i = 1; i < iCols; i++)
        {
            //3.1      
            CString sText = m_list.GetItemText(iRow, i);

            //4. 取字段名
            HDITEMW te;
            TCHAR  lpBuffer[256] = {0};
            te.mask = HDI_TEXT;
            te.pszText = lpBuffer;
            te.cchTextMax = 256;
            m_list.GetHeaderCtrl()->GetItem(i, &te);

            //5. 把字段名 和 字段值 拼接SQL语句
            CString sTemp;
            CString sTitle(lpBuffer);
            sTemp.Format(i == iCols - 1 ? L"%s='%s'" : L"%s='%s' and ", sTitle, sText);

            sSql += sTemp;
        }
        sSql = L"delete from aaa where " + sSql;

        //5. 执行删除语句 从 数据库 删除用户选择的 那一条数据
        m_pCommand->CommandText = _bstr_t(sSql);
        //m_pCommand->CommandType = adCmdText;
        //m_pCommand->ActiveConnection = m_pConnection;
        _RecordsetPtr pRet = m_pCommand->Execute(NULL, NULL, adCmdText);

        if (m_pConnection->Errors > 0)       
        {              
            //提示用户删除成功
            AfxMessageBox(L"删除数据成功!", MB_OK, MB_ICONASTERISK);     

            //更新界面数据
            OnBnClickedBtnQuery();
        }  
        else
        {
            AfxMessageBox(L"删除数据失败!", MB_OK, MB_ICONERROR); 
        }
        //m_pRecordSet->Delete(adAffectCurrent);
    }
    catch (_com_error e)
    {
        MessageBox(e.Description(), MB_OK, MB_ICONERROR);
    }
}

//删除数据2
//void CtestDlg::OnBnClickedBtnDelete()
//{    
//    USES_CONVERSION;
//
//    //1. 获取当前用户要删除的行号
//    POSITION pos = m_list.GetFirstSelectedItemPosition();   
//    int iRow = m_list.GetNextSelectedItem(pos);   
//    if (iRow < 0)
//    {
//        MessageBox(L"请选择要删除的行", MB_OK, MB_ICONERROR);
//        return;
//    }
//
//    try
//    {
//        CString sSql;
//
//        //2. 把要删除那一条数据 的 每个字段名 和 字段值 从界面列表取出来
//        int iCols = m_list.GetHeaderCtrl()->GetItemCount(); 
//        for (int i = 1; i < iCols; i++)
//        {
//            //3.1      
//            CString sText = m_list.GetItemText(iRow, i);
//
//            //4. 取字段名
//            HDITEMW te;
//            TCHAR  lpBuffer[256] = {0};
//            te.mask = HDI_TEXT;
//            te.pszText = lpBuffer;
//            te.cchTextMax = 256;
//            m_list.GetHeaderCtrl()->GetItem(i, &te);
//
//            //5. 把字段名 和 字段值 拼接SQL语句
//            CString sTemp;
//            CString sTitle(lpBuffer);
//            sTemp.Format(i == iCols - 1 ? L"%s='%s'" : L"%s='%s' and ", sTitle, sText);
//
//            sSql += sTemp;
//        }
//        sSql = L"delete from aaa where " + sSql;
//
//        //5. 执行删除语句 从 数据库 删除用户选择的 那一条数据
//        if (m_pRecordSet->State) m_pRecordSet->Close();
//        HRESULT hr = m_pRecordSet->Open(sSql.GetBuffer(), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
//        if (SUCCEEDED(hr))       
//        {  
//            //更新界面数据
//            OnBnClickedBtnQuery();
//
//            //提示用户删除成功
//            AfxMessageBox(L"删除数据成功!", MB_OK, MB_ICONASTERISK);             
//        }  
//        else
//        {
//            AfxMessageBox(L"删除数据失败!", MB_OK, MB_ICONERROR); 
//        }
//    }
//    catch (_com_error e)
//    {
//        MessageBox(e.Description(), MB_OK, MB_ICONERROR);
//    }
//}

//修改数据
void CtestDlg::OnBnClickedBtnModify()
{    
}


四、测试结果

C++实现连接SQL SERVER2008(_ConnectionPtr、_RecordsetPtr、_CommandPtr)_第2张图片

你可能感兴趣的:(C/C++)