ADO方式连接SQL server 2008 R2数据库 MFC

ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口 API 用以实现访问关系或非关系数据库中的数据。

ADO 是一项微软的技术

ADO 指 ActiveX 数据对象(ActiveX Data Objects)

ADO 是一个微软的 Active-X 组件

ADO 会随微软的 IIS 被自动安装

ADO 是一个访问数据库中数据的编程接口

 1 //放在.h文件中例如 stdafx.h
 2 //#import "C://Program Files//Common Files//System//ado//msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
 3 
 4 //这样写是因为上面那句有编译错误
 5 #pragma warning(disable:4146)
 6 #import "C:/Program Files/Common Files/System/ADO/msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
 7 #pragma warning(default:4146)
 8 using namespace ADODB;
 9 
10 //添加一个指向Connection对象的指针
11 _ConnectionPtr m_pConnection;
12 //添加一个指向Recordset对象的指针
13 _RecordsetPtr m_pRecordset;
 1 // 初始化—连接数据库
 2 bool InitADOCOM()
 3 {
 4     // 初始化OLE/COM库环境 
 5     ::CoInitialize(NULL);
 6     try
 7     {
 8         // 创建Connection对象
 9         m_pConnection.CreateInstance("ADODB.Connection");
10         // 设置连接字符串,必须是BSTR型或者_bstr_t类型
11         CString sTemp;
12         //数据库IP 数据库名字 登录ID 登录密码
13         sTemp.Format(_T("Provider=SQLOLEDB.1; Server=%s;Database=%s; uid=%s;pwd=%s;"), m_strServer, m_strDatabase, m_strUserID, m_strPassword);
14         _bstr_t strConnect = sTemp;
15         m_pConnection->Open(strConnect, "", "", adModeUnknown);
16         return TRUE;
17     }
18     // 捕捉异常
19     catch(_com_error e)
20     {
21         // 显示错误信息
22         AfxMessageBox(e.Description());
23         return FALSE;
24     }
25 }
 1 //调用
 2 BOOL bRet;
 3 bRet = InitADOCOM();
 4 if(bRet)
 5 {
 6     MessageBox(_T("数据库连接成功"));
 7 }
 8 else
 9 {
10     MessageBox(_T("数据库连接失败"));
11 }

 

 1 //执行查询
 2 _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL)
 3 {
 4     try
 5     {
 6         //重新连接数据库
 7         if(m_pConnection->GetState() != adStateOpen)
 8         {
 9             OnInitADOCOM();
10         }
11         //创建记录集对象
12         m_pRecordset.CreateInstance(__uuidof(Recordset));
13         //取得表中的记录
14         m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic, adCmdText);
15     }
16     // 捕捉异常
17     catch(_com_error e)
18     {
19         // 显示错误信息
20         AfxMessageBox(e.Description());
21     }
22     // 返回记录集
23     return m_pRecordset;
24 }
 1  _bstr_t strSelect = "select * from testTable";
 2  GetRecordSet(strSelect);
 3  CString qqqq, q123;
 4  while (!m_pRecordset->adoEOF)
 5  {
 6      qqqq = (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("qwer"))->Value);//字段名
 7      q123 = (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("q123"))->Value);//字段名
 8      //MessageBox(qqqq);
 9      //MessageBox(q123);
10      m_pRecordset->MoveNext();
11  }

 

 1 //查询并取出数据
 2 void select()
 3 {
 4     // TODO: 在此添加控件通知处理程序代码
 5     try
 6     {
 7         m_pRecordset.CreateInstance("ADODB.Recordset");
 8         m_pRecordset->Open("select * from testTable",
 9             _variant_t((IDispatch*)m_pConnection, true), adOpenStatic, adLockOptimistic, adCmdText);
10     }
11     catch (_com_error &e)
12     {
13         AfxMessageBox(e.Description());
14     }
15     try
16     {
17         CString strCol1, strCol2;
18         while (!m_pRecordset->adoEOF)
19         {
20             //按照行来循环,取每个字段的数据
21             strCol1 = (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("qwer"))->Value);
22             strCol2 = (_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("q123"))->Value);
23             m_pRecordset->MoveNext();
24         }
25     }
26     catch (_com_error &e)
27     {
28         AfxMessageBox(e.Description());
29     }
30 }
 1 // 执行SQL语句
 2 BOOL ExecuteSQL(_bstr_t bstrSQL)
 3 {
 4     try
 5     {
 6         //重新连接数据库
 7         if(m_pConnection->GetState() != adStateOpen)
 8         {
 9             OnInitADOCOM();
10         }
11         // Connection对象的Execute方法:(_bstr_t CommandText, 
12         // VARIANT * RecordsAffected, long Options ) 
13         // 其中CommandText是命令字串,通常是SQL命令。
14         // 参数RecordsAffected是操作完成后所影响的行数, 
15         // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
16         // adCmdProc-存储过程;adCmdUnknown-未知
17         m_pConnection->Execute(bstrSQL, NULL, adCmdText);
18         return TRUE;
19     }
20     catch(_com_error e)
21     {
22         AfxMessageBox(e.Description());
23         return FALSE;
24     }
25 }
    _bstr_t strSQL = "delete from testTable where qwer = 'fred'";//不区分大小写
    BOOL bRet = ExecuteSQL(strSQL);
    if(bRet)
    {
        MessageBox(_T("执行成功"));
    }else
    {
        MessageBox(_T("执行失败"));
    }

 

 1 //获取某个表的所有字段名
 2 void GetAllColumnNames(CString strTableName)
 3 {
 4     CStringArray columnNamesArray;
 5     FieldPtr pField;
 6     CString strColName = _T("");
 7     CString strSql = _T("");
 8     _bstr_t vSQL = _T("");
 9     strSql.Format(_T("SELECT * FROM %s"), strTableName);
10     vSQL = strSql;
11     //执行这个查询语句
12     _RecordsetPtr pRecordset = GetRecordSet(vSQL);
13     FieldsPtr pFields = pRecordset->GetFields();
14     colNamesArray.RemoveAll();
15     for (int i = 0;i < pFields->Count; i++)
16     {
17         pField = pFields->GetItem(long(i));
18         strColName = (LPCTSTR)(_bstr_t)pField->Name;
19         columnNamesArray.Add(strColName);
20     }
21 }
 1 //获取数据库中的所有表名
 2 void GetAllTableNames()
 3 {
 4     CString strTableName;
 5     CString strSql;
 6     _bstr_t vSQL;
 7     strSql = "select * from sysobjects";
 8     vSQL = strSql;
 9     //执行这个查询语句
10     _RecordsetPtr pRecordset = GetRecordSet(vSQL);
11     CStringArray TableNamesArray;
12     while(!pRecordset->adoEOF)
13     {
14         strTableName = (LPCTSTR)(_bstr_t)pRecordset->GetCollect("name");
15         TableNamesArray.Add(strTableName);
16         pRecordset->MoveNext();
17     }
18 }
 1 // 关闭记录集和连接
 2 void ExitConnect()
 3 {
 4     if (m_pRecordset != NULL)
 5     {
 6         m_pRecordset->Close();
 7         m_pRecordset->Release();
 8         m_pRecordset = NULL;
 9     }
10     if (m_pConnection->GetState() == adStateOpen)
11     {
12         m_pConnection->Close();
13     }
14     if (m_pConnection != NULL)
15     {
16         m_pConnection.Release();
17         m_pConnection = NULL;
18     }
19     // 释放环境
20     ::CoUninitialize();
21 }
//不要多次关闭
ExitConnect();

 

 

上一篇:MP4视频流base64数据转成Blob对象


下一篇:字符串和二进制串相互转换(C++)