1 本文目的
MFC通过ADO对Sql Server 2012 做数据操作,主要操作包含:数据库的连接与断开,数据的查询与插入。
2 操作过程
2.1 配置头文件
在stdafx.h文件中添加如下代码:
#import "C://Program Files//Common Files//System//ado//msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
2.2 数据库的连接
a) 定义一数据库操作类:class AdoSql;
b) 定义成员变量:
_ConnectionPtr m_pConnection; //连接对象
_RecordsetPtr m_pRecordSet; //记录集对象
c) 定义连接数据库函数:
bool AdoSql::InitialConn()
{
::CoInitialize(NULL);
HRESULT hr = NULL;
try
{
hr = m_pConnection.CreateInstance(_uuidof(Connection));//创建连接对象实例;
if (!SUCCEEDED(hr))
{
OutToLog(_T("CreateInstance failed"));
return false;
}
//uid 代表的登录数据库的登录名,pwd为登录密码,server 代表数据库所在的ip和端口号。database为数据库名
_bstr_t strConnect = "Driver={sql server};server=127.0.0.1,1433;uid=sa;pwd=12345678;database=lab_changsha;";
hr = m_pConnection->Open(strConnect, "", "", adModeUnknown);
if (!SUCCEEDED(hr)) {
AfxMessageBox(_T("连接数据库失败"));
return false;
}
}
catch (_com_error e)
{
CString strError;
strError.Format(_T("连接数据库失败\n %s:%s %d"), e.ErrorMessage(), (LPCTSTR)e.Description());
AfxMessageBox(strError);
return false;
}
return true;
}
2.3 读取数据库中表数据
typedef struct CommunicationInfo
{
CString ip;
INT port;
}COMMUNICATION;
//url为sql select遍历语句
bool AdoSql::getInfoCom(CString url, COMMUNICATION& communication_info)
{
try {
m_pRecordSet.CreateInstance(_uuidof(Recordset)); //创建记录集
_variant_t vAffected;
// CString url1 = _T("select equip_ip, equip_port from dbo._0_5_temperature_impact_box");
m_pRecordSet->Open((_variant_t)url, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
_variant_t varian_ip, variant_port;
while (!m_pRecordSet->adoEOF)
{
communication_info.ip = m_pRecordSet->GetCollect("equip_ip");
communication_info.port = (INT)m_pRecordSet->GetCollect("equip_port");
m_pRecordSet->MoveNext();
}
m_pRecordSet->Close();
}
catch (_com_error e)
{
CString strError;
strError.Format(_T("读取数据库数据失败\n %s:%s %d"), e.ErrorMessage(), (LPCTSTR)e.Description());
OutToLog(strError);
m_pRecordSet->Close();
return false;
}
return true;
}
2.4 插入数据
/*
//插入数据的字符串格式,类似于:CString strSql = _T("INSERT family.dbo.Info VALUES(6, \'xiaofan\', \'1997-01-13\', \'zongyang\', \'cloth\')");
char[]用\来转义,而且字符串用''来表示
*/
bool AdoSql::writeDatabase(CString url)
{
try
{
m_pConnection->Execute(_bstr_t(url), NULL, adCmdText);
}
catch (_com_error e)
{
CString strError;
strError.Format(_T("修改数据库数据失败\n %s:%s %d"), e.ErrorMessage(), (LPCTSTR)e.Description());
OutToLog(strError);
return false;
}
return true;
}
2.5 断开数据库连接
void AdoSql::ExitConn()
{
m_pConnection->Close();
return;
}