C++数据库编程——ADO 访问技术

数据库编程——ADO 访问技术


一、使用 ADO 操作数据库

1、ADO 数据库访问步骤分析

  • ADO 数据访问步骤如下:

    1)使用 Connection 对象连接数据源,在此处选择事务支持

    2)使用 Command 创建表示 SQL 命令的对象。

    3)使用 Parameter 对象指定列、表以及 SQL 命令中的值作为变量参数。

    4)使用前面三种对象的其中一个执行命令。

    5)如果命令以行返回,将行存储在 Recordset 记录对象中。

    6)使用 Recordset 对象创建存储对象的视图以便进行数据排序、筛选和定位。

    7)使用 Recordset 对象添加、编辑和删除数据。

    8)使用 Recordset 对象更新数据源。

    9)使用 Connection 对象可以完成事务的提交、事务的取消和事务回滚。

2、使用 ADO 访问数据库实例

2.1、引入对 maado.dll 的引用
  • 在头文件添加以下语句:

    #import "C:\Program Files\Common Files\System\ado\msado15.dll" \
            no_namespace rename("EOF", "adoEOF")
    
  • 并且修改项目配置,启用 C/C+±>代码生成->函数级连接=是(/Gy)。

  • 并在 对话框的 InitInstance() 中添加:AfxoleInit();语句初始化 OLE

2.2、创建连接对象和记录集对象
  • 同样在头文件中添加以下两句话:

    _ConnectionPtr m_pConnection;
    _RecordsetPtr m_pRecordset;
    
2.3、连接数据库
  • 开始连接数据库

    // 连接数据库
    void CDBOption::OnButtonConnect()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	HRESULT hr;
    	try
    	{
    		hr = m_pConnection.CreateInstance("ADODB.Connection");
    		if (SUCCEEDED(hr))  //如果ADO实例创建成功
    		{
    			hr = m_pConnection->Open("driver={SQL Server};Server=[your sever name];Database=[Database source];UID=[登录名];PWD=[密码];", "", "", adModeUnknown);
    			
    		}
    		if (m_pConnection->State)
    			m_editLog.SetWindowText(L"数据库连接成功");
    		else
    			m_editLog.SetWindowText(L"数据库连接失败");
    	}
    	catch (_com_error e)
    	{
    		CString log;
    		log.Format(L"数据库连接失败!\r\n原因:%s\r\n", e.ErrorMessage(),e.Description());
    		MessageBox(log, L"提示", MB_ICONASTERISK);
    	}
    }
    
2.4、读取数据表记录
  • 开始对数据库中的数据表的记录进行读取操作

    // 显示记录
    void CDBOption::GetRecordContent()
    {
    	if (m_pRecordset == NULL)  //记录集为NULL
    		return;
    	if (m_pRecordset->BOF || m_pRecordset->adoEOF)  //记录是头或尾
    		return;
    	_variant_t vID, vName, vSex, vAge;
    	vID = m_pRecordset->GetCollect("ID");
    	vName = m_pRecordset->GetCollect("Agent_Name");
    	vSex = m_pRecordset->GetCollect("Sex");
    	vAge = m_pRecordset->GetCollect("Age");
    	m_ID = (LPCTSTR)(_bstr_t)(vID);
    	m_Name = (LPCTSTR)(_bstr_t)(vName);
    	m_Sex = (LPCTSTR)(_bstr_t)(vSex);
    	m_Age = (LPCTSTR)(_bstr_t)(vAge);
    	UpdateData(false);
    }
    //读取记录
    void CDBOption::OnButtonRead()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	if (m_pConnection == NULL)
    	{
    		MessageBox(L"数据库还未连接\r\n,请连接后再重复此操作", L"提示", MB_ICONASTERISK);
    		return;    //如果还未连接,则返回
    	}
    	m_pConnection->CursorLocation = adUseServer;  //设置连接使用光标类型
    	m_pRecordset.CreateInstance("ADODB.Recordset"); //创建记录对象
    	m_pRecordset->Open("SELECT * FROM Agent",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockBatchOptimistic,adCmdText);
    	GetRecordContent();
    }
    
    // 读取第一条记录
    void CDBOption::OnButtonFirst()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	if (m_pRecordset == NULL)  //如果记录集为空
    		return;
    	m_pRecordset->MoveFirst();  //移动到记录集里的第一条记录
    	GetRecordContent();
    }
    
    // 读取最后一条记录
    void CDBOption::OnButtonLast()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	if (m_pRecordset == NULL)  //如果记录集为空
    		return;
    	m_pRecordset->MoveLast();  //移动到记录集里的最后一条记录
    	GetRecordContent();
    }
    
    // 读取下一条记录
    void CDBOption::OnButtonNext()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	if (m_pRecordset == NULL)  //如果记录集为空
    		return;
    	if (m_pRecordset->adoEOF)
    	{
    		MessageBox(L"已经是最后一条记录!", L"提示", MB_ICONASTERISK);
    		return;  //如果是最后一条记录则返回
    	}
    	m_pRecordset->MoveNext(); //向后移动一条记录
    	GetRecordContent();
    }
    
    // 读取上一条记录
    void CDBOption::OnButtonPrev()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	if (m_pRecordset == NULL)  //如果记录集为空
    		return;
    	if (m_pRecordset->BOF)
    	{
    		MessageBox(L"已经是第一条记录!", L"提示", MB_ICONASTERISK);
    		return;  //如果第一条记录则返回
    	}
    	m_pRecordset->MovePrevious();//向前移动一条记录
    	GetRecordContent();
    }
    
2.5、修改行数据
  • 对相应数据表中的行数据进行修改:

    // 修改数据记录
    void CDBOption::OnButtonChange()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	bool key = false;
    	try
    	{
    		UpdateData(true);
    		_variant_t vID, vName, vSex, vAge;
    		m_pRecordset->Requery(NULL);
    		if (!m_pRecordset->BOF)
    			m_pRecordset->MoveFirst();
    		while (true)
    		{
    			vID = m_pRecordset->GetCollect("ID");
    			if (m_ID == (LPCTSTR)(_bstr_t)(vID))
    			{
    				key = true;
    				break;
    			}
    			m_pRecordset->MoveNext();
    			if (m_pRecordset->adoEOF)
    			{
    				if (m_ID == (LPCTSTR)(_bstr_t)(vID))
    				{
    					key = true;
    					break;
    				}
    				else
    				{
    					MessageBox(L"該编号的客户并不存在\r\n无法进行修改\r\n请检查是否有误", L"提示", MB_ICONASTERISK);
    					break;
    				}
    			}
    		}
    		if (key == true)
    		{
    			UpdateData(true);
    			CString sql,sql1,sql2;
    			sql.Format(L"UPDATE Agent SET Agent_Name='"+ m_Name+L"' WHERE ID=%d", _ttoi(m_ID));
    			sql1.Format(L"UPDATE Agent SET Sex='%s' WHERE ID=%d", m_Sex, _ttoi(m_ID));
    			sql2.Format(L"UPDATE Agent SET Age=%d WHERE ID=%d", _ttoi(m_Age), _ttoi(m_ID));
    			m_pConnection->Execute(_bstr_t(sql), 0, adCmdText);
    			m_pConnection->Execute(_bstr_t(sql1), 0, adCmdText);
    			m_pConnection->Execute(_bstr_t(sql2), 0, adCmdText);
    			m_pRecordset->Requery(NULL);
    			m_pRecordset->MoveLast();
    			GetRecordContent();
    			m_editLog.SetWindowText(L"修改成功");
    		}
    	}
    	catch (_com_error e)
    	{
    		CString log;
    		log.Format(L"修改失败!\r\n原因:%s\r\n%s", e.ErrorMessage(), (LPCTSTR)e.Description());
    		MessageBox(log, L"提示", MB_ICONASTERISK);
    	}
    }
    
    
2.6、增加行数据
  • 对相应数据表的行数据进行添加

    //添加记录
    void CDBOption::OnButtonWrite()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	if (m_pConnection == NULL || m_pRecordset == NULL)
    	{
    		MessageBox(L"数据库未连接\r\n或数据集不存在", L"提示", MB_ICONASTERISK);
    		return;
    	}
    	UpdateData(true);
    	CString strSql;
    	strSql.Format(L"INSERT INTO Agent(ID, Agent_Name, Sex, Age) VALUES(%d, '%s', '%s', %d)", _ttoi(m_ID),m_Name,m_Sex,_ttoi(m_Age));
    	try
    	{
    
    		m_pConnection->Execute(_bstr_t(strSql), 0, adCmdText);
    		m_editLog.SetWindowText(L"写入成功!");
    	}
    	catch (_com_error e)
    	{
    		MessageBox(e.Description());
    		return;
    	}
    }
    
2.7、删除行数据
  • 对相应数据表的行数据进行删除

    // 删除记录
    void CDBOption::OnButtonDelete()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	if (m_pRecordset == NULL)
    	{
    		MessageBox(L"记录集不存在\r\n请先执行读取操作", L"提示", MB_ICONASTERISK);
    		return;
    	}
    	try
    	{
    		UpdateData(true);
    		bool key = false;
    		_variant_t vName;
    		m_pRecordset->Requery(NULL);
    		if (!m_pRecordset->BOF)
    			m_pRecordset->MoveFirst();
    		while (true)
    		{
    			vName = m_pRecordset->GetCollect("Agent_Name");
    			if (m_Name == (LPCTSTR)(_bstr_t)(vName))
    			{
    				key = true;
    				break;
    			}
    			m_pRecordset->MoveNext();
    			if (m_pRecordset->adoEOF)
    			{
    				if (m_Name == (LPCTSTR)(_bstr_t)(vName))
    				{
    					key = true;
    					break;
    				}
    				else
    				{
    					MessageBox(L"该客户不存在\r\n无法进行删除\r\n请确认是否输入错误", L"提示", MB_ICONASTERISK);
    					break;
    				}
    			}
    
    		}
    		if (key==true)
    		{
    			CString sql;
    			sql.Format(L"DELETE FROM Agent WHERE ID=%d",_ttoi(m_ID ));
    			m_pConnection->Execute(_bstr_t(sql), 0, adCmdText);
    			/*m_pRecordset->Delete(adAffectCurrent);
    			m_pRecordset->Update();*/ 
    			m_pRecordset->Requery(NULL);
    			GetRecordContent();
    			m_editLog.SetWindowText(L"删除成功");
    		}
    	}
    	catch (_com_error e)
    	{
    		CString log;
    		log.Format(L"删除失败!\r\n原因:%s\r\n%s", e.ErrorMessage(), (LPCTSTR)e.Description());
    		MessageBox(log, L"提示", MB_ICONASTERISK);
    	}
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御承扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值