各位网友,
我在网站下载的一个MFC ADO方式连接SQL server数据库代码有个地方不明白,请帮忙看看
新建一个按钮,加入如下代码:
void CADOTESTDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
MFC 中debug执行完第2行,m_pConnection中就有了地址,SQL server 中执行Select * from sys.dm_exec_connections可看到新的连接,但是执行完第6行应该m_pConnection中的地址被清空,并且断开连接的,可是实际情况是一直到执行完所有的代码并结束,m_pConnection才被清空并断开连接。
哪位能帮我解释下,谢谢。
void ADOConn::ExitConnect()
{
// 关闭记录集和连接
if (m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
// 释放环境
::CoUninitialize();
//CString temp=_T("0");
}
void ADOConn::OnInitADOConn()
{
// 初始化OLE/COM库环境
//CoInitialize(NULL)和AfxOleInit()的区别: https://blog.csdn.net/zhoubl668/article/details/4139933
::CoInitialize(NULL);
try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect = "Provider=SQLOLEDB; Server=127.0.0.1;Database=dbtest; uid=lnhv013710; pwd=013710;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
}
#pragma once
class ADOConn
{
// 定义变量
public:
//添加一个指向Connection对象的指针:
_ConnectionPtr m_pConnection;
//添加一个指向Recordset对象的指针:
_RecordsetPtr m_pRecordset;
// 定义方法
public:
ADOConn();
virtual ~ADOConn();
// 初始化—连接数据库
void OnInitADOConn();
// 执行查询
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);
// 执行SQL语句,Insert Update _variant_t
BOOL ExecuteSQL(_bstr_t bstrSQL);
void ExitConnect();
};
m_pConnection.CreateInstance("ADODB.Connection");
这里就应该初始化的。
m_pConnection调用Close后连接关闭,可以再次Open,不会自动释放或者指针设置为NULL
不知道你说的第六行是哪个文件的第六行,你也没有标记出行号。如果有别的问题,请留言
你可能以为close以后,m_pConnection类型里面就应该什么都没有了,这是不对的,其实你只是改变了它的状态,并不是把它释放了。
用GetState()这个函数可以获取到连接的状态,返回值是一个枚举:
enum ObjectStateEnum
{ adStateClosed = 0,
adStateOpen = 0x1,
adStateConnecting = 0x2,
adStateExecuting = 0x4,
adStateFetching = 0x8
} ObjectStateEnum;
总而言之,close函数的功能只是关闭连接,并不是清空其内容,请搞清楚概念。