工控编程吧

标题: 上位机MFC如何使用ADO打开和关闭记录集 [打印本页]

作者: qq263946146    时间: 2019-8-9 11:06
标题: 上位机MFC如何使用ADO打开和关闭记录集
首先是引入ADO动态库
#import "c:\program files\common files\system\ado\msado15.dll"\
                no_namespace\
                rename("EOF", "adoEOF")

然后是定义智能指针变量与函数
_ConnectionPtr m_pConnection;
        _RecordsetPtr m_pRecordset;
BOOL OpenDatabase(LPCTSTR lpszConnect, long nOptions=adConnectUnspecified);
BOOL CloseDatabase();
        BOOL OpenRecordset(LPCTSTR lpszSource, long nCursorType=adOpenDynamic,
                long nLockType=adLockOptimistic, long nOptions=adCmdText);
        BOOL CloseRecordset();

再初始化变量
        if (!SUCCEEDED(m_pConnection.CreateInstance(__uuidof(Connection))))
        {
                m_pConnection = NULL;
                TRACE(_T("Database CreateInstance failed"));
        }
        if (!SUCCEEDED(m_pRecordset.CreateInstance(__uuidof(Recordset))))
        {
                m_pRecordset = NULL;
                TRACE(_T("Recordset CreateInstance Failed!"));
        }
        //打开数据库
        CString strConnect = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= Demo.mdb");
        if (!OpenDatabase(strConnect))
        {
                AfxMessageBox(_T("数据库打开失败。"));
        }

这样就可以使用按钮调用我们定义的函数了。

  1. void CGkbc8Dlg::OnButton1()
  2. {
  3.         if (m_pRecordset->State & adStateOpen)
  4.         {
  5.                 AfxMessageBox(_T("记录集已经打开。"));
  6.                 return;
  7.         }

  8.         CString strSource = _T("SELECT * FROM DemoTable");
  9.         if (OpenRecordset(strSource))
  10.         {
  11.                 AfxMessageBox(_T("记录集打开成功。"));
  12.         }
  13.         else
  14.         {
  15.                 AfxMessageBox(_T("记录集打开失败。"));
  16.         }
  17. }

  18. void CGkbc8Dlg::OnButton2()
  19. {
  20.         if (!(m_pRecordset->State & adStateOpen))
  21.         {
  22.                 AfxMessageBox(_T("记录集未打开。"));
  23.                 return;
  24.         }

  25.         if (CloseRecordset())
  26.         {
  27.                 AfxMessageBox(_T("记录集关闭成功。"));
  28.         }
  29.         else
  30.         {
  31.                 AfxMessageBox(_T("记录集关闭失败。"));
  32.         }
  33. }
复制代码
下面是我们自定义的4个函数
  1. BOOL CGkbc8Dlg::OpenDatabase(LPCTSTR lpszConnect, long nOptions)
  2. {
  3.         ASSERT(m_pConnection != NULL);
  4.         ASSERT(lpszConnect != NULL);
  5.         ASSERT(AfxIsValidString(lpszConnect));
  6.        
  7.         //打开数据库连接
  8.         try
  9.         {
  10.                 return SUCCEEDED(m_pConnection->Open(_bstr_t(lpszConnect),
  11.                         _T(""), _T(""), nOptions));
  12.         }
  13.         catch (_com_error& e)
  14.         {
  15.                 TRACE(_T("%s\n"), e.ErrorMessage());
  16.                 return FALSE;
  17.         }
  18. }
  19. BOOL CGkbc8Dlg::CloseDatabase()
  20. {
  21.         ASSERT(m_pConnection != NULL);

  22.         //关闭数据库连接
  23.         try
  24.         {
  25.                 if (m_pConnection->State & adStateOpen)
  26.                 {
  27.                         return SUCCEEDED(m_pConnection->Close());
  28.                 }
  29.                 else
  30.                 {
  31.                         return TRUE;
  32.                 }
  33.         }
  34.         catch (_com_error& e)
  35.         {
  36.                 TRACE(_T("%s\n"), e.ErrorMessage());
  37.                 return FALSE;
  38.         }
  39. }

  40. BOOL CGkbc8Dlg::OpenRecordset(LPCTSTR lpszSource, long nCursorType,
  41.                                                          long nLockType, long nOptions)
  42. {
  43.         ASSERT(m_pConnection != NULL);
  44.         ASSERT(m_pRecordset != NULL);
  45.         ASSERT(lpszSource != NULL);
  46.         ASSERT(AfxIsValidString(lpszSource));

  47.         //打开记录集
  48.         try
  49.         {
  50.                 return (SUCCEEDED(m_pRecordset->Open(_variant_t(lpszSource),
  51.                                                                                 m_pConnection.GetInterfacePtr(),
  52.                                                                                 (CursorTypeEnum)nCursorType,
  53.                                                                                 (LockTypeEnum)nLockType,
  54.                                                                                 nOptions)));
  55.         }
  56.         catch(_com_error e)
  57.         {
  58.                 TRACE(_T("%s\n"), e.ErrorMessage());
  59.                 return FALSE;
  60.         }
  61. }

  62. BOOL CGkbc8Dlg::CloseRecordset()
  63. {
  64.         ASSERT(m_pRecordset != NULL);

  65.         //关闭记录集
  66.         try
  67.         {
  68.                 if (m_pRecordset->State & adStateOpen)
  69.                 {
  70.                         return SUCCEEDED(m_pRecordset->Close());
  71.                 }
  72.                 else
  73.                 {
  74.                         return TRUE;
  75.                 }
  76.         }
  77.         catch (_com_error e)
  78.         {
  79.                 TRACE(_T("%s\n"), e.ErrorMessage());
  80.                 return FALSE;
  81.         }
  82. }
复制代码
最重要的,记得初始化COM库。
  1. if (!SUCCEEDED(CoInitialize(NULL)))
  2.         {
  3.                 ::AfxMessageBox(_T("Failed to initialize COM!"));
  4.                 return FALSE;
  5.         }
复制代码


这里分享一个例程
(, 下载次数: 0)